Leetcode 639.解码方法2

解码方法2

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

‘A‘ -> 1

‘B‘ -> 2

...

‘Z‘ -> 26

除了上述的条件以外,现在加密字符串可以包含字符 ‘*‘了,字符‘*‘可以被当做1到9当中的任意一个数字。

给定一条包含数字和字符‘*‘的加密信息,请确定解码方法的总数。

同时,由于结果值可能会相当的大,所以你应当对109 + 7取模。(翻译者标注:此处取模主要是为了防止溢出)

示例 1 :

输入: "*"

输出: 9

解释: 加密的信息可以被解密为: "A", "B", "C", "D", "E", "F", "G", "H", "I".

示例 2 :

输入: "1*"

输出: 9 + 9 = 18(翻译者标注:这里1*可以分解为1,* 或者当做1*来处理,所以结果是9+9=18)

说明 :

  1. 输入的字符串长度范围是 [1, 105]。
  2. 输入的字符串只会包含字符 ‘*‘ 和 数字‘0‘ - ‘9‘。

 1 public class Solution {
 2     int M = 1000000007;
 3     public int numDecodings(String s) {
 4         Integer[] memo=new Integer[s.length()];
 5         return ways(s, s.length() - 1,memo);
 6     }
 7     public int ways(String s, int i,Integer[] memo) {
 8         if (i < 0)
 9             return 1;
10         if(memo[i]!=null)
11             return memo[i];
12         if (s.charAt(i) == ‘*‘) {
13             long res = 9 * ways(s, i - 1,memo);
14             if (i > 0 && s.charAt(i - 1) == ‘1‘)
15                 res = (res + 9 * ways(s, i - 2,memo)) % M;
16             else if (i > 0 && s.charAt(i - 1) == ‘2‘)
17                 res = (res + 6 * ways(s, i - 2,memo)) % M;
18             else if (i > 0 && s.charAt(i - 1) == ‘*‘)
19                 res = (res + 15 * ways(s, i - 2,memo)) % M;
20             memo[i]=(int)res;
21             return memo[i];
22         }
23         long res = s.charAt(i) != ‘0‘ ? ways(s, i - 1,memo) : 0;
24         if (i > 0 && s.charAt(i - 1) == ‘1‘)
25             res = (res + ways(s, i - 2,memo)) % M;
26         else if (i > 0 && s.charAt(i - 1) == ‘2‘ && s.charAt(i) <= ‘6‘)
27             res = (res + ways(s, i - 2,memo)) % M;
28         else if (i > 0 && s.charAt(i - 1) == ‘*‘)
29             res = (res + (s.charAt(i)<=‘6‘?2:1) * ways(s, i - 2,memo)) % M;
30         memo[i]= (int)res;
31         return memo[i];
32     }
33 }

第一步

第二步

第三步

第四步

第五步

第六步

第七步

第八步

 1 public class Solution {
 2     int M = 1000000007;
 3     public int numDecodings(String s) {
 4         long[] dp = new long[s.length() + 1];
 5         dp[0] = 1;
 6         dp[1] = s.charAt(0) == ‘*‘ ? 9 : s.charAt(0) == ‘0‘ ? 0 : 1;
 7         for (int i = 1; i < s.length(); i++) {
 8             if (s.charAt(i) == ‘*‘) {
 9                 dp[i + 1] = 9 * dp[i];
10                 if (s.charAt(i - 1) == ‘1‘)
11                     dp[i + 1] = (dp[i + 1] + 9 * dp[i - 1]) % M;
12                 else if (s.charAt(i - 1) == ‘2‘)
13                     dp[i + 1] = (dp[i + 1] + 6 * dp[i - 1]) % M;
14                 else if (s.charAt(i - 1) == ‘*‘)
15                     dp[i + 1] = (dp[i + 1] + 15 * dp[i - 1]) % M;
16             } else {
17                 dp[i + 1] = s.charAt(i) != ‘0‘ ? dp[i] : 0;
18                 if (s.charAt(i - 1) == ‘1‘)
19                     dp[i + 1] = (dp[i + 1] + dp[i - 1]) % M;
20                 else if (s.charAt(i - 1) == ‘2‘ && s.charAt(i) <= ‘6‘)
21                     dp[i + 1] = (dp[i + 1] + dp[i - 1]) % M;
22                 else if (s.charAt(i - 1) == ‘*‘)
23                     dp[i + 1] = (dp[i + 1] + (s.charAt(i) <= ‘6‘ ? 2 : 1) * dp[i - 1]) % M;
24             }
25         }
26         return (int) dp[s.length()];
27     }
28 }

原文地址:https://www.cnblogs.com/kexinxin/p/10383052.html

时间: 2024-11-12 14:34:05

Leetcode 639.解码方法2的相关文章

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), "

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

LeetCode OJ:Decode Ways(解码方法)

A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 Given an encoded message containing digits, determine the total number of ways to decode it. For example,Given encoded

[LeetCode] Decode Ways 解码方法

A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 Given an encoded message containing digits, determine the total number of ways to decode it. For example,Given encoded

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

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

使用多字节字符集的跨平台(PC、Android、IOS、WP)编码/解码方法

随着移动端的发展,跨平台已成为通讯架构设计的重要考虑因素,PC.Android.IOS.WP等跨多平台间的数据通讯,必然要解决字符编码/解码的问题. 多字节字符集MBCS不是跨平台的首选字符集,面向跨平台.国际化的推荐字符集肯定是UNICODE. 写VC的人都知道,在以前VC++6.0中默认的字符集是多字节字符集,而VS2005及以后默认的字符集是Unicode,VS2013中默认不再对多字节字符串进行支持. 但对很多较早的服务端项目,依然使用的是多字节字符集,不过使用多字节字符集依然可以实现跨

javascript——URI的编解码方法

有效的URI(统一资源标示符)是不能包含某些字符的,如空格,所以需要进行编码,编码方法有:encodeURI()和encodeURIComponent(), 对编的码进行解码方法有:decodeURI()和decodeURIComponent(). encodeURI()编的码只能decodeURI()解 encodeURIComponent()编的码只能decodeURIComponent()解, encodeURI():用于编码完整的URI,它不对URI中的特殊字符进行编码:例如冒号.前斜杠

C#中Base64之编码,解码方法

原文:C#中Base64之编码,解码方法 1.base64  to  string string strPath =  "aHR0cDovLzIwMy44MS4yOS40Njo1NTU3L19iYWlkdS9yaW5ncy9taWRpLzIwMDA3MzgwLTE2Lm1pZA==";             byte[] bpath = Convert.FromBase64String(strPath);    strPath = System.Text.ASCIIEncoding.