您的位置:首页 > 其它

由LeetCode想到算法中的<横向思维和纵向思维>:

2014-04-24 10:58 330 查看
Decode Ways

A message containing letters from 
A-Z
 is being encoded to numbers using
the following mapping:
'A' -> 1
'B' -> 2
...
'Z' -> 26


Given an encoded message containing digits, determine the total number of ways to decode it.

For example,

Given encoded message 
"12"
, it could be decoded as 
"AB"
 (1
2) or 
"L"
 (12).

The number of ways decoding 
"12"
 is 2.

这是Leetcode上的题目,求数字的解码方式有多少种,可以采用的方式很多,递推、递归、动态规划。。

class Solution
{
public:
int decodeOne(char one) {
return (one == '0') ? 0 : 1;
}
int decodeTwo(char one, char two) {
if( (one == '1') || (one == '2' && two <= '6') )
return 1;
else
return 0;
}
int fun(string s, int i) {
if(i == 0 ) return decodeOne(s[0]);
if(i == 1) return ( decodeOne(s[0]) & decodeOne(s[1]) ) + decodeTwo(s[0], s[1]);

if(i >= 2) {
int sum = 0;
if(decodeOne(s[i])) sum += fun(s, i-1);
if(decodeTwo(s[i-1], s[i]) ) sum += fun(s, i-2);
return sum;
}
}

int numDecodings(string s)
{
if(s.size() == 0 || s[0] == '0') return 0;
return fun(s, s.size() - 1);
}
};
主要讨论下面这段代码:

int sum = 0;
if(decodeOne(s[i])) sum += fun(s, i-1);
if(decodeTwo(s[i-1], s[i]) ) sum += fun(s, i-2);
return sum;

这里要求的是f(n)的值,它依赖于f(n-1) 和 f(n-2) 、同时跟两个判断条件有关。s[i] 能否解码、s[i-1]能否解码、s[i-1]s[i]两位数能否解码,决定了f(n) 如何跟f(n-1) f(n-2)建立联系,那么会出现的状况有很多种,分析出来写成代码会很难看,因为状况多、给人感觉思路不清。 由于是计数,可以采用累加的方法,当s[i]可以解码的时候出现了多少情况,当s[i-1]s[i]两位数可以解码出现了多少情况,依次算加法加起来,这样不用分析组合状态,只用分析单个状态就能得出结果。

        横向思维:将问题分成多种情况,针对每种情况提出方案。

        纵向思维:将问题考虑成一种情况,对过程中的不同情况做处理。

PS:本题用 划分状态后写出来的代码要么难看,要么难懂!@#¥#@~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: