91. 解码方法

91. 解码方法 

https://leetcode-cn.com/problems/decode-ways/ 

 

91. 解码方法_第1张图片

 对于一个字符串我们有两种选择,选一个 选两个

91. 解码方法_第2张图片

 注意 0 00 0X 这些坑

91. 解码方法_第3张图片

暴力递归

91. 解码方法_第4张图片

class Solution {
    private int n;
    public int numDecodings(String s) {
        n = s.length();
        return dfs(s, 0);
    }
    private int dfs(String s, int start) {
        if (start >= s.length()) {
            return 1;
        }
        //0开头的无法翻译
        //00,01
        if (s.charAt(start) == '0') {
            return 0;
        }
        //选一个
        int res = dfs(s, start + 1);
        //选两个(保证能选,start不能到最后一个字符那里去了)
        if (start < n - 1 && Integer.parseInt(s.substring(start, start + 2)) <= 26) {
            res += dfs(s, start + 2);
        }
        return res;
    }
}

需要采用记忆化搜索

91. 解码方法_第5张图片

/**
 * https://blog.csdn.net/qq_40794973/article/details/102508362
 * https://leetcode-cn.com/problems/decode-ways/
 */
class Solution {
    private int n;
    // dp[n] 重n开始的子串解码方法的总数
    int[] dp;
    public int numDecodings(String s) {
        n = s.length();
        dp = new int[n];
        Arrays.fill(dp, -1);
        return dfs(s, 0);
    }
    private int dfs(String s, int start) {
        if (start >= s.length()) {
            return 1;
        }
        //0开头的无法翻译
        //00,01
        if (s.charAt(start) == '0') {
            return 0;
        }
        if (dp[start] != -1) {
            return dp[start];
        }
        //选一个
        int res = dfs(s, start + 1);
        //选两个(保证能选,start不能到最后一个字符那里去了)
        if (start < n - 1 && Integer.parseInt(s.substring(start, start + 2)) <= 26) {
            res += dfs(s, start + 2);
        }
        dp[start] = res;
        return res;
    }
    //public static void main(String[] args) {
    //    // "AB"(1 2)或者 "L"(12)
    //    System.out.println(new Solution().numDecodings("12"));
    //    // "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6)
    //    System.out.println(new Solution().numDecodings("226"));
    //
    //    //(20 6)
    //    System.out.println(new Solution().numDecodings("206"));
    //}
}
class Solution {
    private int[] cache;
    public int numDecodings(String s) {
        cache = new int[s.length() + 1];
        Arrays.fill(cache, -1);
        return dfs(s);
    }
    private int dfs(String s) {
        if (s.equals("")) {
            return 1;
        }
        if (s.charAt(0) == '0') {
            return 0;
        }
        //字符串长度
        int len = s.length();
        if (cache[len] != -1) {
            return cache[len];
        }
        int res = dfs(s.substring(1));
        if (s.length() >= 2 && Integer.parseInt(s.substring(0, 2)) <= 26) {
            res += dfs(s.substring(2));
        }
        return cache[len] = res;
    }
}
//public static void main(String[] args) {
//    System.out.println(new Solution().numDecodings("12"));
//    System.out.println(new Solution().numDecodings("226"));
//    //1     20 6
//    System.out.println(new Solution().numDecodings("206"));
//    //1     10
//    System.out.println(new Solution().numDecodings("10"));
//    //3
//    System.out.println(new Solution().numDecodings("12120"));
//    //System.out.println("1".substring(1).equals(""));
//    //System.out.println("666".substring(1));
//    //System.out.println("15699".substring(0, 2));
//    //System.out.println("15699".substring(2));
//}

639. 解码方法 2 

https://leetcode-cn.com/problems/decode-ways-ii/

你可能感兴趣的:(oj刷题)