文章目录
91. 解码方法:
一条包含字母
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 位 的整数。
样例 1:
输入:
s = "12"
输出:
2
解释:
它可以解码为 "AB"(1 2)或者 "L"(12)。
样例 2:
输入:
s = "226"
输出:
3
解释:
它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
样例 3:
输入:
s = "06"
输出:
0
解释:
"06" 无法映射到 "F" ,因为存在前导零("6" 和 "06" 并不等价)。
提示:
1 <= s.length <= 100
s
只包含数字,并且可能包含前导零。
分析:
- 面对这道算法题目,二当家的再次陷入了沉思。
- 首先需要分析注意几个点,合法的解码数字范围是 1 到 26 ,所以 0 一定出现在个位,最重要的就是类似于 12 这种,可以解码为一个字母 “L” ,也可以解码为两个字母 “AB” 。
- 当一个数字不是 0 或者说是
[1,9]
时,可以解析为[A,I]
。 - 当一个数字和前一个数字可以组成一个两位数,并且范围是
[10,26]
时,可以解析为[J,Z]
,就多出一种解码方式。 - 由于结果依赖于前面的解码情况,可以用动态规划,但是并不需要存储 n 个结果,因为每个解码数量 fi 的值仅与 fi−1 和 fi−2 有关,所以可以仅用三个变量,滚动存储临时结果。
- 要特别注意前导0是无效的。
题解:
rust:
implSolution{pubfnnum_decodings(s:String)->i32{let n = s.len();// a = dp[i-2], b = dp[i-1], c=dp[i]let(mut a,mut b,mut c)=(0,1,0);(1..=n).for_each(|i|{
c =0;if s.as_bytes()[i -1]!=b'0'{
c += b;}if i >1&& s.as_bytes()[i -2]!=b'0'&&((s.as_bytes()[i -2]-b'0')*10+(s.as_bytes()[i -1]-b'0')<=26){
c += a;}
a = b;
b = c;});return c;}}
go:
funcnumDecodings(s string)int{
n :=len(s)// a = dp[i-2], b = dp[i-1], c = dp[i]
a, b, c :=0,1,0for i :=1; i <= n; i++{
c =0if s[i-1]!='0'{
c += b
}if i >1&& s[i-2]!='0'&&((s[i-2]-'0')*10+(s[i-1]-'0')<=26){
c += a
}
a, b = b, c
}return c
}
c++:
classSolution{public:intnumDecodings(string s){constint n = s.size();// a = dp[i-2], b = dp[i-1], c = dp[i]int a =0, b =1, c =0;for(int i =1; i <= n;++i){
c =0;if(s[i -1]!='0'){
c += b;}if(i >1&& s[i -2]!='0'&&((s[i -2]-'0')*10+(s[i -1]-'0')<=26)){
c += a;}tie(a, b)={b, c};}return c;}};
python:
classSolution:defnumDecodings(self, s:str)->int:
n =len(s)# a = dp[i-2], b = dp[i-1], c = dp[i]
a, b, c =0,1,0for i inrange(1, n +1):
c =0if s[i -1]!='0':
c += b
if i >1and s[i -2]!='0'andint(s[i -2:i])<=26:
c += a
a, b = b, c
return c
java:
classSolution{publicintnumDecodings(String s){finalint n = s.length();// a = dp[i-2], b = dp[i-1], c=dp[i]int a =0, b =1, c =0;for(int i =1; i <= n;++i){
c =0;if(s.charAt(i -1)!='0'){
c += b;}if(i >1&& s.charAt(i -2)!='0'&&((s.charAt(i -2)-'0')*10+(s.charAt(i -1)-'0')<=26)){
c += a;}
a = b;
b = c;}return c;}}
非常感谢你阅读本文~
欢迎【点赞】【收藏】【评论】三连走一波~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~
版权归原作者 二当家的白帽子 所有, 如有侵权,请联系我们删除。