Topic:
A message containing letters from was A-Z
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 is "12"
2.
test instructions and Analysis: the key to give a A-Z character corresponding to the number, give a string composed of a number, the need to find a possible A-Z encoding. This problem is also the topic of dynamic planning, for the character of the string I (I>2), because the maximum number of encodings is 26, so to that point may be encoded and the previous character is also related, if the current character and the previous character composed of the number D=s.charat (i-1) *10+ S.charat (i),
(1) When 0<d<=26, if d%10!=0, there are two ways to reach the I-character (from the i-1 word multibyte a character reached, from the i-2 word multibyte a character reached), i.e. F (S.charat (i)) =f (S.charat (i-1)) +f ( S.charat (i-2)); If i%10=0, there is only one way to achieve F (s.charat (i)) =f (S.charat (i-2))
(2) When d>26, if d%10!=0, then a method reaches I point (i.e. from i-1 to i), F (S.charat (i)) =f (S.charat (i-1)), if d%10=0, there is no corresponding encoding to express d these two characters, so direct return 0
(3) When the d==0, the string appears two consecutive 0, the direct return 0
The first two numeric characters of a string are processed separately, the same as above, and then traversing the string to get the final result.
Code:
public class Solution {public int numdecodings (String s) {int[] a=new int[s.length ()];//Record the Decode method for the position I of the current string if (S.length () <=1) {if (s.length () ==0) return 0; else{if (s.charat (0) = = ' 0 ') return 0; else return 1; }} if (S.length () >=2) {if (S.charat (0) = = ' 0 ')//returns 0 return 0 if 0 is included; } a[0]=1;//the first digit of the string must have only one matching method int x= (S.charat (0)-' 0 ') *10+ (S.charat (1)-' 0 ');//first two-digit value if (x>26&&x%10==0) return 0; if (x<=26&&x>0) if (x!=10&&x!=20) a[1]=2; else {a[1]=1;} else if (S.charat (1)! = ' 0 ') a[1]=1; else {a[1]=0;} for (int i=2;i<s.length (); i++) {//record the current character and the number of previous characters, if this number is less than or equal to 26, then to the current method D (S.charat (i)) =d (S.charat (i-1)) +d (S.char at (i-2)), otherwise D (S.charat (i)) =0 int temp= (S.charat (i-1)-' 0 ') *10+ (S.charat (i)-' 0 '); if (temp<=26&&TEMP>0)//between 0 and 26 and the previous number is not 0 if (S.charat (i-1)! = ' 0 ' &&s.charat (i)! = ' 0 ') a[i]=a[i-2]+a[i-1]; else a[i]=a[i-2]; else if (temp>26)//In the middle there is greater than 30 if (temp%10!=0) a[i]=a[i-1]; else {return 0;} The else//contains two consecutive 0 return 0; } return A[s.length ()-1]; }}
[Leetcode] 91. Decode Ways Java