把数字翻译成字符串
1.题目描述
一条包含字母 A-Z 的消息通过以下方式进行了编码:
给定一个只包含数字的非空字符串,请计算解码方法的总数。
示例 1:
示例 2:
2.思路
利用动态规划
1.dp[i]为s[0…i]的译码方法总数
2.分情况讨论:
(1)若s[i] = ‘0’,那么如果s[i-1]=‘1’ or ‘2’,则dp[i] = dp[i-2];否则返回0。
解释:s[i-1]+s[i]唯一被译码,不增加情况。
(2)若s[i-1]=‘1’,则dp[i]=dp[i-1]+dp[i-2]
解释:s[i-1]和s[i]分开译码,总数为dp[i-1];合并译码,总数为dp[i-2]。
(3)若s[i-1]='2’并且‘1’<=s[i]<=‘6’,则dp[i]=dp[i-1]+dp[i-2]
解释:同上
3.代码
class Solution {
public:
int numDecodings(string s) {
if(s.empty() || s[0] == '0'){
return 0;
}
int curr = 1, pre = 1;
for(int i = 1;i < s.size();++i){
int temp = curr;
if(s[i] == '0'){
if(s[i-1] == '1' || s[i-1] == '2'){
curr = pre; //s[i-1]s[i]唯一解码,所以次数等于dp[i-2]的
}
else{
return 0;
}
}
else if(s[i-1] == '1' || (s[i-1] == '2' && s[i] >= 1 && s[i] <= '6')){
curr = curr + pre;
}
pre = temp;
}
return curr;
}
};
4.复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)