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

The number of ways decoding "12" is 2.

开始想自顶向下求解,结果发现有些情况求解不出来,于是换成dp。

主要思想:

当一个字符串S[0,n] 再加上一个字符ch的时候.有如下两种情况

1.字符串s[n]+ch的组合可以组成一个合法的字母,字符串S.append(ch) 的解是s[n-2] + 1个解,因为最后两个数字可能有两种组合

2.字符串s[n]+ch的组合无法组成一个合法字母,但是ch是个合法字母,那么S.append(ch)的解应该就是s[n-1]的解,因为最后一个字符只能append上去,被解析成一个固定的a-z

public class Solution {
    
    public boolean valid(String s) {
        if (Integer.parseInt(String.valueOf(s.charAt(0)))<1 || Integer.parseInt(String.valueOf(s.charAt(0)))>9) {
            return false;
        }
        int n = Integer.parseInt(s);
        if (n<=26 && n>=1) {
            return true;
        } else {
            return false;
        }
    }
    
    public int numDecodings(String s) {
        if (s==null||s.length()==0) {
            return 0;
        }
        if (s.length()==1&&valid(s)) {
            return 1;
        }
        int[] ans = new int[s.length()];
        if (!valid(String.valueOf(s.charAt(0)))) {
            return 0;
        } else {
            ans[0] = 1;
        }
        if (valid(String.valueOf(s.charAt(1)))) {
            ans[1] += 1;
        }
        if (valid(String.valueOf(s.charAt(0))+String.valueOf(s.charAt(1)))) {
            ans[1] += 1;
        }
        for (int i=2; i<s.length(); i++) {
            ans[i] = 0;
            if (valid(String.valueOf(s.charAt(i)))) {
                ans[i] += ans[i-1];
            }
            if (valid(String.valueOf(s.charAt(i-1))+String.valueOf(s.charAt(i)))) {
                ans[i] += ans[i-2];
            }
        }

        return ans[s.length()-1];
    }
}
原文地址:https://www.cnblogs.com/23lalala/p/3515011.html