题目链接:https://leetcode-cn.com/problems/decode-ways/description/

参考:https://www.jianshu.com/p/5a604070cd11

题目大意:将一串数字,编码成A-Z的字符串。因为12-->L,或者12-->AB。所有12转成字符串一共有两种方式。该题目是求一共有多少种方案,所以可以使用dp方法。如果是求具体方案,则需要使用dfs。

状态转移方程:

(1) dp[0] = 0

(2) dp[1] = 1, if str[1] is valid
dp[1] = 0, if str[1] is not valid (3)
dp[n] = 0 if str[n] is valid
    dp[n] += dp[n - 1]
if str[n - 1] combine str[n] is valid
dp[n] += (i - 2 == 0) ? 1 : dp[n - 2]
dp[i]:前面i个字符串可以转义成多少种密文。
    public int numDecodings(String s) {
if (s.length() == 0 || s == null || s == "0")
return 0; int[] dp = new int[s.length() + 1];
dp[0] = 1; if (isValid(s.substring(0, 1)))
dp[1] = 1;
else
dp[1] = 0; for (int i = 2; i <= s.length(); i++) {
if (isValid(s.substring(i - 1, i)))
dp[i]= dp[i - 1];
if (isValid(s.substring(i - 2, i)))
dp[i]= dp[i - 2]+dp[i];
}
return dp[s.length()];
} public boolean isValid(String s) {
if (s.charAt(0) == '0')
return false;
int code = Integer.parseInt(s);
return code >= 1 && code <= 26;
}

扩展一下:如果不需要时间限制,并且需要求出具体方案。则需要使用dfs算法求出具体方案。

注意:Java中的substring(beginIndex,endIndex):大概意思返回 [beginIndex,endIndex)区间的值。所以endIndex的最大值可以是字符串的程度。

Returns a new string that is a substring of this string. The substring begins at the specified beginIndex and extends to the character at index endIndex - 1. Thus the length of the substring is endIndex-beginIndex.

Examples:

 "hamburger".substring(4, 8) returns "urge"
"smiles".substring(1, 5) returns "mile"
System.out.println("226".substring(3, 3));//返回为""(空)
接下来使用dfs计算出所有的可能的方式。
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map; public class Solution {
static LinkedList<String> list = new LinkedList<String>();
static LinkedList<LinkedList<String>> ans = new LinkedList<LinkedList<String>>();
Map<String, String> map = new HashMap<String, String>(); public int numDecodings(String s) {
ans.clear();
char[] alphatableb = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
'V', 'W', 'X', 'Y', 'Z' };
for (int i = 0; i < alphatableb.length; i++) {
map.put(i + 1 + "", alphatableb[i] + "");
}
dfs(s);
return ans.size();
} private void dfs(String s) {
if (s.isEmpty() || s.length() == 0) {
LinkedList<String> tmp = new LinkedList<String>();
tmp.addAll(list);
ans.add(tmp);
return;
}
for (int i = 1; i <= 2&&i<=s.length(); i++) {
String str = s.substring(0, i);
if (isValid(str)) {
String ss = map.get(str);
list.add(ss);
dfs(s.substring(i, s.length()));
list.pollLast();
} else {
return;
}
}
} public boolean isValid(String s) {
if (s.charAt(0) == '0')
return false;
int code = Integer.parseInt(s);
return code >= 1 && code <= 26;
} public static void main(String[] args) {
System.out.println("226".substring(3, 3));
int len = new Solution().numDecodings("226");
System.out.println(len);
System.out.println(ans);
} }
												

动态规划之91 decode ways的更多相关文章

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

    Leetcode 91. Decode Ways 解码方法(动态规划,字符串处理) 题目描述 一条报文包含字母A-Z,使用下面的字母-数字映射进行解码 'A' -> 1 'B' -> 2 ...

  2. leetcode@ [91] Decode Ways (Dynamic Programming)

    https://leetcode.com/problems/decode-ways/ A message containing letters from A-Z is being encoded to ...

  3. 【LeetCode】91. Decode Ways 解题报告(Python)

    [LeetCode]91. Decode Ways 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fux ...

  4. [LeetCode] 91. Decode Ways 解码方法

    A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...

  5. 91. Decode Ways

    题目: A message containing letters from A-Z is being encoded to numbers using the following mapping: ' ...

  6. leetcode 91 Decode Ways I

    令dp[i]为从0到i的总方法数,那么很容易得出dp[i]=dp[i-1]+dp[i-2], 即当我们以i为结尾的时候,可以将i单独作为一个字母decode (dp[i-1]),同时也可以将i和i-1 ...

  7. 91. Decode Ways反编译字符串

    [抄题]: A message containing letters from A-Z is being encoded to numbers using the following mapping: ...

  8. 91. Decode Ways(动态规划 26个字母解码个数)

    A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...

  9. leetcode 91 Decode Ways ----- java

    A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...

随机推荐

  1. Windows服务器时间不同步问题

    一台域内的服务器时间不停地被修改,我先向用户收集了一些信息 只有这一台出现此问题,其他服务器均为正常(补充一下,问题快解决完的时候用户告诉我一个重要的消息,就是时间被修改了一段时间后自动会被修改回去) ...

  2. Ecshop 表结构 字段说明

    ecs_account_log 用户帐号情况记录表,包括资金和积分等 log_id mediumint 自增ID号user_id mediumint 用户登录后保存在session中的id号,跟use ...

  3. 本地tp项目上传服务器报runtime/cache错误

    很简单,给runtime权限777 就好了 chmod -r 777 runctime

  4. 详解Linux下iptables中的DNAT与SNAT设置(转)

    详解Linux下iptables中的DNAT与SNAT设置 这篇文章主要介绍了Linux下iptables中的DNAT与SNAT设置,是Linux网络配置中的基础知识,需要的朋友可以参考下   原文连 ...

  5. Aggregated Counting(找规律 + 预处理)

    Aggregated Counting 转 : https://blog.csdn.net/cq_phqg/article/details/48417111 题解: 可以令n=1+2+2+3+3+.. ...

  6. 【Linux学习四】正则表达式

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 一.grep:显示匹配行v:反显示e:使用扩展正则表达式E:不使用正则 ...

  7. Tomcat JAR包冲突报错

    查看Tomcat下有两个PDF加密的jar包如图: 删除这个bcprov-jdk14-138.jar包,然后重启Tomcat就好了. 这个jar包和Tomcat中的一个包冲突,反复调用导致的. 参考: ...

  8. golang学习笔记18 用go语言编写移动端sdk和app开发gomobile

    golang学习笔记18 用go语言编写移动端sdk和app开发gomobile gomobile的使用-用go语言编写移动端sdk和app开发https://blog.csdn.net/u01249 ...

  9. javamail邮件Multipart支持同时发text和html混合消息,alternative纯文本与超文本共存

    javamail邮件Multipart支持同时发text和html混合消息alternative纯文本与超文本共存 multipart/mixed:附件. multipart/related:内嵌资源 ...

  10. vue路由5:命名视图

    <div id="app"> <div> <router-link to="/">首页</router-link> ...