title : Number of decoding methods
Difficulty : Medium
topic content :
A message containing letters from was A-Z
being encoded to numbers using the following mapping:
' A '-1 ' B '-2 ... ' Z '-26
Given a non-empty string containing only digits, determine the total number of ways to decode it.
translation :
A message containing a-Z letter is encoded as a number, using the following mappings:
"A"-> 1
"B"-> 2
......
"Z"-> 26
Given a non-empty string containing a number, determine the total number of methods to decode it.
My idea : At first I wanted to use recursion but the boundary problem was too much to give up.
Single starts at 0 (each array is decoded separately), Count starts at 1, if s[i-1]s[i] the number of the two is within the (0,26] range, then count+;
And when you meet 0, the individual code at the beginning does not exist, and there is less chance of a combination, such as "110" in "11" and "0" can not be combined
So at this point, single = 0;count-1
My Code :
1 Public intnumdecodings (String s) {2 if(S.isempty () | | S.charat (0) = = ' 0 ')3 return0;4 5 intCount = 0;6 intSingle = 1;7 for(inti = 1; I < s.length (); i++) {8 if(S.charat (i) = = ' 0 '){9Count = S.length () > 2? Count-1: Count;TenSingle = 0; One } A intx = Integer.parseint (s.substring (i-1, i+1)); - if(x<= && x > 0) { -Count + = 1; the } - } - return(Count + single) > 0? (Count + single): 0; -}
results :214/258 Test cases passed.
Input:"1212" Output:4 expected:5
problems in the encoding process :
1. The original single and count are not calculated separately;
2, the 9th line, when only two, at this time count does not need-1, such as "10";
3, this idea still has the problem, for example "1212" in less calculated "12" "12" this combination
Answer code :
1 Public classSolution {2 Public intnumdecodings (String s) {3 intn =s.length ();4 if(n = = 0)return0;5 6 int[] Memo =New int[N+1];7Memo[n] = 1;8Memo[n-1] = S.charat (n-1)! = ' 0 '? 1:0;9 Ten for(inti = n-2; I >= 0; i--) One if(S.charat (i) = = ' 0 ')Continue; A ElseMemo[i] = (Integer.parseint (s.substring (i,i+2)) <=26)? MEMO[I+1]+MEMO[I+2]: memo[i+1]; - - returnMemo[0]; the } -}
Answer Ideas :
Assuming that all the numbers are valid, and that the left and right 22 adjacent numbers are also valid (1 to 26), then there are the following rules
numdecodings (s) = Numdecodings (s.substring (1)) + numdecodings (s.substring (2)) ---------------------------- ---------------------- -style (1)
The rule is obvious, Fibonacci sequence. It's just the opposite. (Forward from behind the string)
Of course, that's just a hypothesis, and a special case to consider:
" use an array (size of len+1) to record the corresponding number of digits after the" occurrence "of the number of decoded increments "
1, the current pointer refers to a character of 0
This character cannot be decoded at this time, so the former in the formula (1) can only be 0, the latter is also 0
For example "023", substring (1)--"0" | "23", the truncated "0" cannot be resolved, so this combination is invalid
SUBSTRING (2)--"02" | "3", the truncated "02" cannot be parsed, so this combination is invalid
So after 0 numbers appear, the number of decoding increments is 0.
2. The value of the current character is valid (greater than 0), but the number of the current character combined with the right character is not valid (greater than 26)
Equivalent (1) in the latter =0
For example "3212", substring (1)--"3" | "212", truncated "3" can parse, so its value is "212" decoding number
SUBSTRING (2)--"32" | "12", The truncated "32" cannot be parsed, so this combination is invalid \
Recursive implementations:
1 Public intnumdecodings (String s) {2 if(S.isempty ()) {3 return1;4 }5 6 if(S.charat (0) = = ' 0 ') {7 return0;8 } 9 Ten if(s.length () = = 1) One return1; A - intSub1 = Numdecodings (s.substring (1)); - intSUB2 = 0; the - if(Integer.parseint (S.substring (0,2)) <= 26) { -Sub2 = Numdecodings (s.substring (2)); - } + returnSub1 +Sub2; -}
This method runs out in the last few use cases (very long).
So the answer takes the form of an iterative approach.
Optimization: Since it is a Fibonacci sequence, you can use a double-valued iteration instead of an array for recording .
1 Public intnumdecodings (String s) {2 if(S.isempty () | | S.charat (0) = = ' 0 ') {3 return0;4 }5 intSub1 = 1;6 intSUB2 = 1;7 for(inti = S.length ()-2; i >-1; i--) {8 if(S.charat (i+1) = = ' 0 ') {9Sub1 = 0;Ten } One if(Integer.parseint (S.substring (i,i+2)) <= 26) { ASub1 = Sub1 +Sub2; -SUB2 = Sub1-Sub2; -}Else { theSUB2 =sub1; - } - } - returnsub1; +}
The 11th line can also be judged using characters to reduce the complexity of time and space:
S.charat (i) = = ' 1 ' | | S.charat (i) = = ' 2 ' && S.charat (i+1)-' 0 ' <= 6
Leetcode [91] (Java): Decode Ways (number of decoding methods)