题解 | #把数字翻译成字符串#
把数字翻译成字符串
http://www.nowcoder.com/practice/046a55e6cd274cffb88fc32dba695668
转载自:NC116把数字翻译成字符串_牛客博客
https://blog.nowcoder.net/n/c0a01037177b4775b632242d8dd02d73?f=comment
基本和上面的一样,这个题解作为自己的思考理解和复习用,感觉写还比较容易懂,欢迎大家交流!
// NC116把数字翻译成字符串
class Solution {
public:
/**
* 解码
* @param nums string字符串 数字串
* @return int整型
*/
int solve(string nums) {
// write code here
/* 定义状态:
dp[i]:以下标为i结尾的字符串的解码方式数
状态转移:
1、当nums[i]==0;由于0没有对应解码方式,只能和前一位nums[i-1]组合。且前一位只能为1或者2
dp[i]=dp[i-2];(i>1) 因为最后两位如果能解码,那么它的解码数量取决dp[i-2],因为最后两位固定了
dp[i]=1;(i=1) 因为此时只有两位数,能解码的话就只有一种方式
2、当nums[i]!=0;
分析2.1、当nums[i-1]为1的时候,满足要求
分析2.2、当nums[i-1]为2的时候,判断下nums[i]是否在1-6之间,因为>26的数无法解码
dp[i]=dp[i-1]+dp[i-2];//因为在11-26之间(20在上面已经判断完了),可以组合解码,也可以单个解码
3、初始化
dp[0]=1;
4、结果返回
dp[n-1];n为nums的长度
*/
//注意nums中的是字符,要注意字符转数字的方式
int len=nums.size();
if(len==0) return 1;
if(nums[0]=='0') return 0;
vector<int>dp(len);
dp[0]=1;
for(int i=1;i<len;++i){
// 如果是0结尾
if(nums[i]=='0'){
// 如果前一位是1或者2,也就是能组合解码
if( nums[i-1]=='1' || nums[i-1]=='2' ){
if(i==1)
dp[i]=1;//如果只有两位
else
dp[i]=dp[i-2];
}
//如果前一位不是1或者2,那这串就解码不了,默认0
}else{
//如果nums[i]!=0;
if( nums[i-1]=='1' || (nums[i-1]=='2' && nums[i]>='1' && nums[i]<='6' ) ){
if(i==1)
dp[i]=2;
else
dp[i]=dp[i-1]+dp[i-2];
}else{
// 如果是其他条件,如果xxxx37;就只能拆开
dp[i]=dp[i-1];
}
}
}
return dp[len-1];
}
};
查看8道真题和解析