转移方程分析如下,设f[n]字符串的前n位的最多可能编码结果。
对于字符串中的一个数字字符:
1.如果在是在字符[1,9],那么有一种方案就是单独将这个字符拿出,那么方案数是f[n-1]
2.如果这个字符和前面的字符能组成在字符串[10,26]之间的字符串,那么这也是一种方案,在这种方案下,我们需要将当前字符和前面的一个字符拿出,这种方案的方案数是f[n-2]
除了转移方程外我们仍然需要注意一些编程上的细节,第一个数时f[1]=1,第二个数如果产生了上面第二种情况,那么我们直接进行加一,因为减二的那个数不存在。
代码如下所示:
class Solution {
public:
/**
* 解码
* @param nums string字符串 数字串
* @return int整型
*/
int solve(string nums) {
vector<int> res(nums.size());
int size=nums.size();
for(int i=0;i<size;++i){
if(i==0) res[i]=1;
else{
if(nums[i]>='1' && nums[i]<='9'){
res[i]+=res[i-1];
}
string tmp = nums.substr(i-1, 2);
if(tmp>="10" && tmp<="26" && i>=2){
res[i]+=res[i-2];
}
if(tmp>="10" && tmp<="26" && i==1){
res[i]+=1;
}
}
}
return res[size-1];
}
};