力扣91.解码方法

题目

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

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

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

示例 1:

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

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

问题分析

如果当前位为0,则必须和前一位结合进行解码(0无法自己解码),此时有dp[n-2]种方式(假设前i位有dp(i)种方式)

如果当前位为1-9,有两种情况

1、单独解码,此时有dp[n-1]种方式
2、和前一位结合解码,此时有dp[n-2]种方式。(这种解码方式需要满足前一位和当前位结合在1-26之间)

所以状态转移方程为dp[i] = dp[i-1] + dp[i-2](满足一定条件时,不满足则为dp[i] = dp[i-1] )

代码如下:

public int numDecodings(String s) {
        int len = s.length();
        if(s.charAt(0) == '0') return 0;
        if(len == 0 || len == 1) return len;
        for(int i = 1;i < len;i++){
            //只要有00连在一起就是0,比如100
            if(s.charAt(i-1) == '0' && s.charAt(i) == '0'){
                return 0;
            }
            //0前面接着比2大的数就是0,比如50
            if(s.charAt(i) == '0' && s.charAt(i-1) > '2'){
                return 0;
            }
        }
        int[] dp = new int[len];
        dp[0] = 1;
        int PreTwoNum = (s.charAt(0) - 48) * 10 + (s.charAt(1) - 48);
        //第二位不为0且前两位组合起来处于10-26之间,并且不为20为两种方式,否则为1种方式
        dp[1] = PreTwoNum > 10 && PreTwoNum <= 26 && PreTwoNum != 20 ? 2 : 1;
        for(int i = 2;i < len;i++){
            if(s.charAt(i) == '0'){
                dp[i] = dp[i - 2];
            }else{
                int TwoNum = (s.charAt(i-1) - 48) * 10 + (s.charAt(i) - 48);
                if(TwoNum <= 26 && TwoNum >= 11){
                    dp[i] = dp[i - 1]+dp[i - 2];
                }else{
                    dp[i] = dp[i - 1];
                }
            }
        }
        return dp[len - 1];

原文地址:https://www.cnblogs.com/wangbobobobo/p/10988909.html

时间: 2024-11-08 03:13:07

力扣91.解码方法的相关文章

91. 解码方法

题目描述 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数. 示例 1: 输入: "12" 输出: 2 解释: 它可以解码为 "AB"(1 2)或者 "L"(12). 示例 2: 输入: "226" 输出: 3 解释: 它可以解码为 "BZ" (2 26), "

leetcode 91. 解码方法 JAVA

题目: 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数. 示例 1: 输入: "12" 输出: 2 解释: 它可以解码为 "AB"(1 2)或者 "L"(12). 示例 2: 输入: "226" 输出: 3 解释: 它可以解码为 "BZ" (2 26), "

91.解码方法(动态规划)

一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1'B' -> 2...'Z' -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数. 初思路: 一看到本题,我就想用回溯算法来递归,因为遇到 10<s[:2]<27的时候 就可以递归两条路径,一条是分开,一条是合并 但是递归方法时间复杂度高,存在大量的重复计算,比如 分开转化s[0],s[1] 与合并s[0:2],还是回到处理 s[2:]的路径上,所以我再去看看答案. 观后思路: 本题确实就是 爬

leetcode——91.解码方法

class Solution: def numDecodings(self, s: str) -> int: a={} if int(s[0])==0: return 0 else: a[0]=1 if len(s)==1: return a[0] if int(s[0])>2 and int(s[1])==0: a[1]=0 if len(s)>1: return 0 if (int(s[0]+s[1])>26) or (int(s[0])<3 and int(s[1])=

Leetcode 91. Decode Ways 解码方法(动态规划,字符串处理)

Leetcode 91. Decode Ways 解码方法(动态规划,字符串处理) 题目描述 一条报文包含字母A-Z,使用下面的字母-数字映射进行解码 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给一串包含数字的加密报文,求有多少种解码方式 举个例子,已知报文"12",它可以解码为AB(1 2),也可以是L (12) 所以解码方式有2种. 测试样例 Input: "0" "121212" "1010

卡特兰数(Catalan number)-力扣96

卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)的名字来命名,其前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 244662

[Swift]LeetCode639. 解码方法 2 | Decode Ways II

A message containing letters from A-Z is being encoded to numbers using the following mapping way: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 Beyond that, now the encoded string can also contain the character '*', which can be treated as one of the numbers

力扣算法题—042接雨水

1 #include"000库函数.h" 2 //一点头绪都没有 3 //然后就自己按自己的意思来一遍 4 //好像没有用算法 5 //16ms,让我激动一把 6 7 class Solution { 8 public: 9 int trap(vector<int>& height) { 10 if (height.size() < 2)return 0; 11 int s = 0;//起始点 12 int e = 0;//终止点 13 int v = 0;/

力扣题目汇总(加一,旋转数组,整数反转)

力扣题目汇总(加一,旋转数组,整数反转) 加一 1.题目描述 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储一个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 示例 1: 输入: [1,2,3] 输出: [1,2,4] 解释: 输入数组表示数字 123. 示例 2: 输入: [4,3,2,1] 输出: [4,3,2,2] 解释: 输入数组表示数字 4321. 2.解题思路 #错误思路 列表最后一位加1,判断最后