判断一个数字组成的字符串转化为大写的字母,问有多少种组合的方式。
用动态规划来做,但是其实我之前写的太繁琐了,而且没有通过,所以参考了下别人写的,果然还是我想的太复杂了。
用一个dp[3],因为只用考虑自己和前两个数,所以数组容量为3即可。
class Solution {
public:
int numDecodings(string s) {
if(s.length()==0)return 0;
int dp[3];
if(s[0]!='0')dp[0]=1;
else dp[0]=0;
for(int ii=1;ii<s.length();ii++){
dp[ii%3]=0;
if(s[ii]!='0')dp[ii%3]=dp[(ii-1)%3];
int tt=(s[ii]-'0')+(s[ii-1]-'0')*10;
if(tt>=10&&tt<=26){
if(ii-2>=0)dp[ii%3]+=dp[(ii-2)%3];
else dp[ii%3]++;
}
}
int len=s.length()-1;
return dp[len%3];
}
};
我之前写的,对比一下,而且是没有通过的代码,也不想看了,但是不知道为什么是runtime error。
class Solution {
public:
int numDecodings(string s) {
if(s.length()==0)return 0;
else if(s.length()==1)return 1;
int dp[3];
dp[0]=1;
if(s[0]>'2')dp[1]=1;
else if(s[1]=='0')dp[1]=1;
else if(s[0]=='1')dp[1]=2;
else if(s[0]=='2'&&s[1]>='1'&&s[1]<='6')dp[1]=2;
for(int ii=2;ii<s.length();ii++){
//if(ii==1)
if(s[ii-1]<='2'&&s[ii]>='1'&&dp[ii]<='6')dp[ii%3]=dp[(ii-2)%3]+dp[(ii-1)%3];
else if(s[ii-1]=='1'&&s[ii]>='1'&&dp[ii]<='9')dp[ii%3]=dp[(ii-2)%3]+dp[(ii-1)%3];
else if(s[ii]=='0')dp[ii%3]=dp[(ii-2)%3];
else dp[ii%3]=dp[(ii-1)%3];
}
//cout<<"eeee"<<endl;
int len=s.length()-1;
return dp[len%3];
}
};