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,有点郁闷,这道题的dp思路是这样的,若当前索引为n,若此时n的字符不为'0',则代表n处包含索引n-1所包含的所有可能组合,若n-1不为0,且n n-1组成的数字小于等于26,即也可以表示成一个字符,那么n处包含索引n-2所包含的所有可能组合,代码:
public int numDecodings(String s) { int[] dp=new int[s.length()]; if(s.length()==0) return 0; if(s.length()==1) return s.charAt(0)=='0'?0:1; dp[0]=s.charAt(0)=='0'?0:1; dp[1]=(s.charAt(0)!='0'&&s.charAt(1)!='0'?1:0)+((s.charAt(0)!='0'&&((s.charAt(0)-'0')*10+s.charAt(1)-'0')<=26)?1:0); for(int i=2;i<s.length();i++){ if(s.charAt(i)!='0') dp[i]+=dp[i-1]; if(s.charAt(i-1)!='0'&&((s.charAt(i-1)-'0')*10+s.charAt(i)-'0')<=26) dp[i]+=dp[i-2]; } return dp[s.length()-1]; }