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]; } }