题目描述
有一种将字母编码成数字的方式:‘a’->1, ‘b->2’, … , ‘z->26’。现在给一串数字,返回有多少种可能的译码结果。
示例1
输入:“31717126241541717”
返回值:192 说明:192种可能的译码结果
题解:使用动态规划算法,dp[i]表示前 i 个字母译码个数,由题意可知,dp[i] 可以由两部分组成,一部分是dp[i-1],指向前看一位(条件:nums[i-1] 不为0则dp[i] = dp[i-1],如果nums[i-1] 为0,则dp[i]=0,原因在于此时我们是以一位一位来编码的,但是如果一位数字是0的话,这样的编码方式是不存在的,所以dp[i]=0),另一部分是dp[i-2] 指向前看两位(条件是前两位组成的数字范围在10~26之间),dp[i] 最后将这两种情况相加即可得到。返回的结果是dp[n],表示前 n 位译码的个数。
class Solution {
public:
/**
* 解码
* @param nums string字符串 数字串
* @return int整型
*/
int solve(string nums) {
// write code here
int n = nums.size();
vector<int> dp(n+1,0);
dp[0]=1;
for(int i=1;i<=n;i++)
{
dp[i] = nums[i-1]=='0'?0:dp[i-1];
if(i>=2)
{
int t = (nums[i-2]-'0')*10+ nums[i-1]-'0';
if(t>=10 && t<=26) dp[i]+=dp[i-2];
}
}
return dp[n];
}
};