题目
一条包含字母 A-Z 的消息通过以下方式进行了编码:
'A' -> 1
'B' -> 2
...
'Z' -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。
示例 1:
输入: "12"
输出: 2
解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。
示例 2:
输入: "226"
输出: 3
解释: 它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/decode-ways
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目解析
这个题找边界真的很烦人
很喜欢的很简洁的一个题解
int numDecodings(string s) {
if (s[0] == '0') return 0;
int pre = 1, curr = 1;//dp[-1] = dp[0] = 1
for (int i = 1; i < s.size(); i++) {
int tmp = curr;
if (s[i] == '0')
if (s[i - 1] == '1' || s[i - 1] == '2') curr = pre;
else return 0;
else if (s[i - 1] == '1' || (s[i - 1] == '2' && s[i] >= '1' && s[i] <= '6'))
curr = curr + pre;
pre = tmp;
}
return curr;
}
作者:pris_bupt
链接:https://leetcode-cn.com/problems/decode-ways/solution/c-wo-ren-wei-hen-jian-dan-zhi-guan-de-jie-fa-by-pr/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
以下是我乱糟糟的写法
class Solution {
public:
int numDecodings(string s) {
int len=s.length();
int rec[len];
memset(rec,0,sizeof(rec));
//rec[i]=rec[i-1]+1+(rec[i-2]+1);错误 考虑解码方式不是解码的字母数
//rec[i]=
if(len==1){
if(s[0]-'0'>0)
return 1;
else
return 0;
}
if(s[0]-'0'>0)
rec[0]=1;
else
return 0;
int rmo=(s[0]-'0')*10+(s[1]-'0');
if(rmo<=26){
if(rmo==0){
rec[1]=0;
}else if(rmo<=10||rmo%10==0)
rec[1]=1;
else{
rec[1]=2;
}
}
else
rec[1]=rec[0];
if(s[1]=='0'&&rmo>26&&len>1)
return 0;
for(int i=2;i<len;i++){
rec[i]=rec[i-1];
if(s[i]=='0'&&(s[i-1]>='3'||s[i-1]=='0')){
return 0;
}else if(s[i]=='0'&&s[i-1]>'0'&&s[i-1]<'3'){
rec[i]=rec[i-2];
continue;
}
if((s[i-1]-'0')*10+(s[i]-'0')<=26&&(s[i-1]-'0')*10+(s[i]-'0')>9)
rec[i]+=rec[i-2];
// cout<<rec[i-1]<<endl;
}
return rec[len-1];
}
};
网友评论