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:本题用 划分状态后写出来的代码要么难看,要么难懂!@#¥#@~