题目大意:A-Z分别编码为1-26,给你一个数字串,问这个数字串有多少种解码方法?
如 12有两种1,2和12分别是AB 和 L
0开头的认为是非法的,因为无法解码,同样 1001也无法解码
这些特殊情况可以在代码中特殊处理,此题可以用简单的DP解决
比如串 s=121212;a[i]来表示第i个字节时能有多少解码方式
a[1]=1;a[2]=2;a[3]=a[1]+a[2];a[i]=a[i-2]+a[i-1]当且仅当s[i-1]s[i]组成的数字能解码且s[i]也能解码。其他情况同理分析,代码写的很直白
下面是AC代码
class Solution {
public:
int numDecodings(string s) {
int a[10000];
int len=s.length(),num;
if(s[0]>'0' && s[0]<='9')
a[0]=a[1]=1;
else
return 0;
for(int i=2;i<=len;i++)
{
num=(s[i-2]-'0')*10+(s[i-1]-'0');
if(num==0)return 0;
if(num>26 && s[i-1]=='0')return 0;
a[i]=a[i-1];
if(num<27 && num>10 && s[i-1]!='0')
a[i]=a[i-1]+a[i-2];
if(num==10)
a[i]=a[i-2];
};
return a[len];
}
};