标签:遍历 string sizeof leetcode 动态规划
一、 题目
给定一个字符串包含26个字母,字母与数字产生映射,如:
‘A’ --> 1
‘B’ --> 2
…
‘Z’ --> 26
如果给一串数字,请给出编码的方式有多少?
*注意:’12’ 可以编码成”AB”,也可以编码成”L”.
二、 分析
可以看出题目的目的是考察动态规划,即每走一步可能有两种情况,是不是和爬台阶很像呢?对的。
这道题思路有两种但是思路是一样的:
1、 从前往后遍历
(1)、ans[0] = 1;
(2)、如果s[0] = ‘0’,ans[1] = 0;否则ans[1] = 1;
(3)、遍历判断s[i-1]是否等于’0’,为0则ans[i] = 0;否则等于ans[i-1],再判断与后面一位组成的数是否大于26,小于则ans[i]= ans[i] + ans[i-2]
2、 从后往前遍历
(1)、ans[len] = 1;
(2)、如果s[len-1] = ‘0’,ans[len-1] = 0;否则ans[len-1]= 1;
(3)、遍历判断s[i]是否等于’0’,为0则continue;否则判断与后面一位组成的数是否大于26,大于则ans[i] = ans[i+1],否则ans[i] = ans[i+1] + ans[i+2]
1、正序遍历法:
class Solution { public: int numDecodings(string s) { int len = s.size(); if(len == 0) return 0; int ans[len+1]; ans[0] =1; if(s[0] != '0') ans[1] = 1; else ans[1] = 0; for(int i=2;i<=len;i++){ if(s[i-1] != '0') ans[i] = ans[i-1]; else ans[i] = 0; if(s[i-2] == '1'||(s[i-2] == '2' && s[i-1] <= '6')) ans[i] = ans[i] + ans[i-2]; } return ans[len]; } };
class Solution { public: int numDecodings(string s) { int len = s.size(); if(len == 0) return 0; int ans[len+1]; memset(ans,0,len*sizeof(int)); ans[len] =1; if(s[len-1] != '0') ans[len-1] = 1; else ans[len-1] = 0; for(int i=len-2;i>=0;i--){ if(s[i] == '0') continue; if(s[i] > '2'||(s[i] == '2' && s[i+1] > '6')) ans[i] = ans[i+1]; else ans[i] = ans[i+1] + ans[i+2]; } return ans[0]; } };
标签:遍历 string sizeof leetcode 动态规划
原文地址:http://blog.csdn.net/zzucsliang/article/details/42175591