91. Decode Ways
2017-04-28 23:05
197 查看
91. Decode Ways
已知:
‘A’---1
‘B’--2
...
'Z'--26
给出一个字符串例如“12”则有可能是当作“AB”(1 2)也有可能是“L”(12)故一共有2中看法。
思路,很明显这是一个多层次影响求单值问题,可以采用动态规划:引入数组dp[i]表示s0,s1,...si-1这样前i个字符求法个数,注意字符串s每一位都有可能取值‘0-9’
1 当当前位s[i-1]=='0':
若前一位s[i-2]=='1'||s[i-2]=='2'则s[i-2]s[i-1]一定是在一起这一种解法,故dp[i]=dp[i-2]
否则不满足转换原则,直接返回0
2 否则,如果前面数字为1或者前面数字为2且当前数字在1~6之间,说明都可以进行2种编码(分开dp[i-1]或者和在一起dp[i-2]),因此dp[i] = dp[i-1] + dp[i-2];
3 其他情况,当前数字必须单独进行编码转换,因此dp[i] = dp[i-1]
已知:
‘A’---1
‘B’--2
...
'Z'--26
给出一个字符串例如“12”则有可能是当作“AB”(1 2)也有可能是“L”(12)故一共有2中看法。
思路,很明显这是一个多层次影响求单值问题,可以采用动态规划:引入数组dp[i]表示s0,s1,...si-1这样前i个字符求法个数,注意字符串s每一位都有可能取值‘0-9’
1 当当前位s[i-1]=='0':
若前一位s[i-2]=='1'||s[i-2]=='2'则s[i-2]s[i-1]一定是在一起这一种解法,故dp[i]=dp[i-2]
否则不满足转换原则,直接返回0
2 否则,如果前面数字为1或者前面数字为2且当前数字在1~6之间,说明都可以进行2种编码(分开dp[i-1]或者和在一起dp[i-2]),因此dp[i] = dp[i-1] + dp[i-2];
3 其他情况,当前数字必须单独进行编码转换,因此dp[i] = dp[i-1]
int numDecodings(string s){ int n=s.size(); if(n<1||s[0]=='0')return 0; for(int i=0;i<n-1;i++) if(s[i]=='0'&&s[i+1]=='0')return 0; vector<int>dp(n+1); dp[0]=1; dp[1]=1; for(int i=2;i<=n;i++) {if(s[i-1]=='0'){ if(s[i-2]=='1'||s[i-2]=='2')dp[i]=dp[i-2]; else return 0; } else if(s[i-2]=='1'||(s[i-2]=='2'&&(s[i-1]>='1'&&s[i-1]<='6')))dp[i]=dp[i-1]+dp[i-2]; else dp[i]=dp[i-1]; } return dp ; }
相关文章推荐
- leetcode 91. Decode Ways
- leetcode 91. Decode Ways
- leetcode - 198,213. House Robber(II) & 91. Decode Ways
- 91. Decode Ways
- [leetcode] 91. Decode Ways
- 【LeetCode】91. Decode Ways
- 91. Decode Ways
- leetcode 91. Decode Ways
- leetcode 91. Decode Ways
- 【DP】递推【91. Decode Ways】
- LeetCode 91. Decode Ways
- leetcode 91. Decode Ways
- leecode 解题总结:91. Decode Ways
- [leetcode]91. Decode Ways(Java)
- LeetCode 91. Decode Ways
- LeetCode 91. Decode Ways(解码方法)
- 91. Decode Ways
- leetcodeOJ 91. Decode Ways
- Leetcode 91. Decode Ways
- 91. Decode Ways