Leetcode--91. 解码方法
发布日期:2021-04-30 21:00:12 浏览次数:242 分类:精选文章

本文共 1156 字,大约阅读时间需要 3 分钟。

解码方法的总数可以通过动态规划来高效计算。具体来说,我们需要解决一个字符串解码问题,其中每个字符可以表示为1到26的数字。给定一个只包含数字的字符串,我们需要计算它可以以多少种方式被解码。

问题分析

我们可以将每个字符转换为对应的字母。例如,数字1对应'A',数字2对应'B',直到数字26对应'Z'。解码方法分为两种情况:单独的字符和两位数组成的字符。

  • 单独字符:每个1到9的数字都可以单独作为一个字符解码。
  • 两位数组成的字符:两位数组成的数字必须在10到26之间,且第一位不能为0。
  • 动态规划思路

    我们可以使用动态规划来解决这个问题。设dp[i]表示前i个字符的解码方法数。初始化dp[0]=1,因为空字符串有1种解码方式。

    对于每个位置i,我们需要考虑两种解码方式:

  • 当前字符作为单独字符解码。
  • 当前字符和前一个字符组成两位数解码。
  • 解决代码

    class Solution {    public int numDecodings(String s) {        int[] dp = new int[s.length() + 1];        dp[0] = 1;        for (int i = 1; i <= s.length(); i++) {            if (s.charAt(i-1) != '0') {                dp[i] += dp[i-1];            }            if (i >= 2) {                int num = (s.charAt(i-2) - '0') * 10 + (s.charAt(i-1) - '0');                if (num <= 26 && s.charAt(i-2) != '0') {                    dp[i] += dp[i-2];                }            }        }        return dp[s.length()];    }}

    代码解释

  • 初始化:创建一个长度为字符串长度+1的dp数组,dp[0]=1表示空字符串的解码方法数。
  • 遍历字符串:从第一个字符开始遍历。
  • 单独字符解码:如果当前字符不是0,则将dp[i] += dp[i-1]。
  • 两位数解码:如果当前位置允许组成两位数(i>=2),检查两位数组成的数字是否在10到26之间,且第一位不是0。如果满足条件,dp[i] += dp[i-2]。
  • 返回结果:dp数组的最后一个元素即为所有解码方法的总数。
  • 这个方法通过记录每一步的解码方法数,避免了重复计算,时间复杂度为O(n),空间复杂度为O(n)。

    上一篇:CSS基础知识点总结、二
    下一篇:Acwing 220. 最大公约数

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2026年05月26日 23时01分43秒