91. 解码方法(字符串)

该博客探讨了一道关于字符串解码的LeetCode题目。解码方法是将一个仅包含数字的字符串转换成字母组合。文章通过举例说明解码过程,并提出这是一道递推问题。博主详细解释了解码的两种情况:字符本身代表一个编码,或者与前一个字符组合成编码。还提到了解码过程中需要注意的非法情况,如前导0、连续0和编码超出字母范围等。最后,博客中给出了具体的解题思路和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

一条包含字母 A-Z 的消息通过以下方式进行了编码:

'A' -> 1
'B' -> 2
...
'Z' -> 26

给定一个只包含数字的 非空 字符串,请计算解码方法的总数。

题目数据保证答案肯定是一个 32 位的整数。

示例 1:

输入:"12"
输出:2
解释:它可以解码为 "AB"(1 2)或者 "L"(12)。

示例 2:

输入:"226"
输出:3
解释:它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。

示例 3:

输入:s = "0"
输出:0

示例 4:

输入:s = "1"
输出:1

示例 5:

输入:s = "2"
输出:1

提示:

  • 1 <= s.length <= 100
  • s 只包含数字,并且可以包含前导零。

思路

这是一道递推的题目,我们依次遍历每个字符,那么对于每个字符,有这样两种情况:(为了方便描述,令 nums[i] 表示 0-i 对应的解码数量)

  1. 自己本身就是一个编码;那么 nums[i] = nums[i-1]
  2. 与前一个字符组成一个编码;这种情况下,nums[i] = nums[i-2]

所以 nums[i] = nums[i-1] + nums[i-2],当然这两种情况是否合法,需要具体讨论。

另外这道题有一个坑点,题目并不保证给定的编码是合法的,也就是在解码过程中发现变法不合法,要返回0;不合法的有以下几种情况:

  1. 001,包含前导0的;
  2. 1001,多个连续0的;
  3. 230,30不在1-26范围内;

具体见代码:

代码

class Solution {
    public int numDecodings(String s) {
        int n1 = 0, n2 = 1, ans = 0;
        for (int i=0; i<s.length(); i++) {
            int t = s.charAt(i) - '0';
            if (t == 0) {
                if (i > 0)
                    t += (s.charAt(i-1)-'0')*10;
                if (t > 0 && t <= 26)
                    ans = n1;
                else
                    return 0;
            } else {
                ans = n2;
                if (i > 0 && s.charAt(i-1) != '0') {
                    t += (s.charAt(i-1)-'0')*10;
                    if (t <= 26)
                        ans += n1;
                }
            }
            n1 = n2;
            n2 = ans;
        }
        return ans;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值