一条包含字母 A-Z
的消息通过以下映射进行了 编码 :
'A' -> "1" 'B' -> "2" ... 'Z' -> "26"
要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,"11106"
可以映射为:
-
"AAJF"
,将消息分组为(1 1 10 6)
-
"KJF"
,将消息分组为(11 10 6)
注意,消息不能分组为 (1 11 06)
,因为 "06"
不能映射为 "F"
,这是由于 "6"
和 "06"
在映射中并不等价。
给你一个只含数字的 非空 字符串 s
,请计算并返回 解码 方法的 总数 。
题目数据保证答案肯定是一个 32 位 的整数。
思路一:动态规划
int numDecodings(char * s){
int n = strlen(s);
int dp[n+1];
memset(dp,0,sizeof(dp));
dp[0] = 1;
for(int i = 1;i<=n;i++){
if(s[i-1]!='0') dp[i]+=dp[i-1];
if(i>1&& s[i - 2] != '0' && ((s[i - 2] - '0') * 10 + (s[i - 1] - '0') <= 26))dp[i]+=dp[i-2];
}
return dp[n];
}
分析:
根据题意,可以写成状态方程dp[i]+=dp[i-1];和dp[i]+=dp[i-2];,当s[i-1]!='0'时即前一位不为零,前面的一位数可以构成一个编码,当前前那个不为零且前两个数小于等于26时前两位可以构成一个编码,再编写相应代码即可文章来源:https://www.toymoban.com/news/detail-669445.html
总结:
本题考察动态规划的应用,将能够构成编码的两种情况考虑完全即可做出文章来源地址https://www.toymoban.com/news/detail-669445.html
到了这里,关于leetcode做题笔记91. 解码方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!