解码方法

详情参见leetcode 91.解码方法

我的解法:


dfs深度遍历优先搜索,遇到错误情况返回。

错误情况包含以下三种:

  1. 单个为0或者两个字符以0为前导;
  2. 两个字符的值大于26 即不为A~Z;
  3. 整个字符转含有前导0。

但是因为字符串长度为 1 ≤ length ≤ 1000,采用dfs的开销太大,超出时间限制,故不可取。

代码如下:

class Solution {
public:int answer=0;//计数string str;//全局存储void dfs(int cur) {if(cur>=str.size()) {answer++;return;}if(str[cur]=='0') return;dfs(cur+1);//第一种情况if(cur<=str.size()-2) {//第二种情况if( (str[cur]-'0')*10 + (str[cur+1]-'0') <= 26 ) {dfs(cur+2);}}return;}int numDecodings(string s) {str=s;if(str[0]=='0') return 0;//当含有前导0时 返回0if(str.size()==1) return 1;//仅含有一个数据元素时dfs(1);if( (str[0]-'0')*10 + (str[1]-'0') <= 26) {//不超过限制时dfs(2);}return answer;}
};

动态规划解法:

对于一个确定的字符串 s 而言,当在其后添加一个字符后,按照题目要求存在的情况,

其能组成的所有可能为:s 的所有情况 + ( s - s [length-1] )的所有情况 (当然还有排除不存在的情况)

不妨设:s 的长度为n,并且从左至右的字符串分别为 s [1] 、s [2] …s[n];

故我们可以使用动态规划的方法,计算出每一个 s [ i ] 阶段所含有的满足题意的解码方法数。

由最开始的描述,具体地,设 f [ i ] 表示字符串 s 的前 i 个字符 s[1…i] 的解码方法数。

在进行状态转移时,我们可以考虑最后一次解码使用了 s 中的哪些字符,那么会有下面的两种情况:

  • 如果 s [ i ] ≠ 0,那么它就可以被单独分解,故 f [ i ] = f [ i - 1 ];
  • 对 s [ i - 1] 和 s [ i ]进行组合编码,并且s [ i - 1] ≠ 0 和 二者组成的字符串不能大于26,故f [ i ] = f [ i - 2 ];

动态规划的边界条件设置为 f [ 0 ] = 1,空字符串也是一种可能 (因为 length≥1 )

class Solution {public int numDecodings(String s) {int n = s.length();int[] f = new int[n + 1];f[0] = 1;//动态规划的边界条件for (int i = 1; i <= n; ++i) {if (s.charAt(i - 1) != '0') {f[i] += f[i - 1];//单个字符情况}if (i>1 && s.charAt(i-2) != '0' && ((s.charAt(i-2)-'0') * 10 + (s.charAt(i-1)-'0') <= 26)) {f[i] += f[i - 2];//双个字符情况}}return f[n];}
}

解码方法( dfs | dp )相关推荐

  1. leetcode 91. 解码方法(dp)

    解题思路 记忆化搜索,记录已经计算过的子问题 代码 func numDecodings(s string) int {temp:=make([]int,len(s),len(s))for i := r ...

  2. 125. Leetcode 91. 解码方法 (动态规划- 字符串系列)

    步骤一.确定状态: 确定dp数组及下标含义 dp[i]表示的是到i这个位置的字符串的解码方法 步骤二.推断状态方程: dp[i]的推导会取决于当前s[i]的字符情况以及前一位字符,具体如下: 如果当前 ...

  3. 【DP】LeetCode91 解码方法 【java】

    题目 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 - 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数. 示例 ...

  4. LeetCode 90子集Ⅱ91解码方法

    微信搜一搜:bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打卡群,欢迎 ...

  5. LeetCode 371. 两整数之和(异或操作) / 639. 解码方法 II(动态规划)/ 437. 路径总和 III

    371. 两整数之和 2021.9.26 每日一题 题目描述 给你两个整数 a 和 b ,不使用 运算符 + 和 - ​​​​​​​,计算并返回两整数之和. 示例 1: 输入:a = 1, b = 2 ...

  6. Leetcode 91. 解码方法 (每日一题 20211013)

    一条包含字母 A-Z 的消息通过以下映射进行了 编码 :'A' -> 1 'B' -> 2 ... 'Z' -> 26 要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映 ...

  7. 639. 解码方法 II

    639. 解码方法 II 一条包含字母 A-Z 的消息通过以下的方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 要 解码 一条已编码的消息,所有的数 ...

  8. leetcode91. 解码方法

    一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 - 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数. 示例 1: ...

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

    1. 题目 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数 ...

最新文章

  1. 【重磅】斯坦福李飞飞最新《注意力与Transformer》总结,84页ppt下载!
  2. c语言编译器bug,关于c语言的一个小bug详解
  3. [深入理解MySQL系列] - sort_buffer
  4. CPU_X86架构和ARM架构入门篇
  5. MyBatis-动态sql语句-if用法——MySQL系列学习笔记
  6. android r 编译找不到头文件_「投稿」iOS逆向——砸壳与反编译
  7. 如何将Web项目的默认编译输出目录改为WebContent/WEB-INF/classe
  8. .NET Micro Framework开发板用户简明手册(v3.0)
  9. android光标属性设置,光标设置、hint设置
  10. 熊海cms v1.0 SQL注入漏洞复现
  11. 《数据结构与算法分析:Java语言描述》.pdf
  12. 局域网考勤python_Python3.7实现中控考勤机自动连接
  13. 学会这120个PS小技巧,工作效率提高5倍!
  14. 1000瓶水里面有一瓶毒水,通过用兔子去喝水的方式检验,只能让兔子喝一次水,那么最少用多少只兔子检验出来是哪一瓶?
  15. 题8:二叉树的下一个结点
  16. tensor.view().permute()
  17. 借款必须先买商品再折旧,分期易和通联支付联合收割借款人,年化利率高达240%
  18. 【文本匹配】ESIM模型
  19. 基于IEC61499 的楼宇自动控制系统
  20. 你的生日代表什么花的寓意?

热门文章

  1. Linux上github提示Permission denied (publickey),如何才能解决?
  2. Spring Cloud入门-Admin服务监控中心(Hoxton版本)
  3. 美国佐治亚大学计算机专业,美国计算机专业大学排名TOP10
  4. vue 汉字转拼音字母
  5. [图像去雨]--Arixv-Gradual Network for Single Image De-raining
  6. 低功耗设计及其UPF实现第四节(最后一节)
  7. java nas smb_FreeNAS 02:深入 SMB 服务使用
  8. 自动生成企业画像(标签)
  9. ipqc异常处理流程图_品质异常该怎么处理?照这个流程走!
  10. WordCount 官方源码解读及工程代码