leetcode面试准备:Decode Ways

网友投稿 255 2022-10-27


leetcode面试准备:Decode Ways

1 题目

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 message "12", it could be decoded as "AB" (1 2) or "L" (12).The number of ways decoding "12" is 2.

接口:public int numDecodings(String s);

2 思路

一维动态规划,偷懒了,照搬博文。分析:需要注意的是,如果序列中有不能匹配的0,那么解码方法是0,比如序列012 、100(第二个0可以和1组成10,第三个0不能匹配)。

递归的解法很容易,但是大集合会超时。转换成动态规划的方法,假设dp[i]表示序列s[0...i-1]的解码数目动态规划方程如下:初始条件:dp[0] = 1, dp[1] = (s[0] == '0') ? 0 : 1dp[i] = ( s[i-1] == 0 ? 0 : dp[i-1] ) + ( s[i-2,i-1]可以表示字母 ? dp[i-2] : 0 ), 其中第一个分量是把s[0...i-1]末尾一个数字当做一个字母来考虑,第二个分量是把s[0...i-1]末尾两个数字当做一个字母来考虑

复杂度: Time O(n); Space O(n)

3 代码

public int numDecodings(String s) {        // 1.初始化         final int len = s.length();        if (len == 0)            return 0;        int[] dp = new int[len + 1];         dp[0] = 1;        if (s.charAt(0) != '0')             dp[1] = 1;        else             dp[1] = 0;        // 2.一维DP方程         for (int i = 2; i <= len; i++) {            if (s.charAt(i - 1) != '0')                 dp[i] = dp[i - 1];            else                 dp[i] = 0;            if (s.charAt(i - 2) == '1'                     || (s.charAt(i - 2) == '2' && s.charAt(i - 1) <= '6'))                 dp[i] += dp[i - 2];         }        return dp[len];     }

4 总结

写递归的解法


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:ArgoUML -- 开源UML 建模工具
下一篇:API的文档自动生成——基于CDIF的SOA基本能力
相关文章

 发表评论

暂时没有评论,来抢沙发吧~