题目链接:decode-ways
相似题型:70.Climbing Stairs
import java.util.Arrays;
/**
*
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.
*
*/
public class DecodeWays {
//解法一
// 256 / 256 test cases passed.
// Status: Accepted
// Runtime: 189 ms
// Submitted: 0 minutes ago
//时间复杂度O(n) 空间复杂度O(n)
//降低空间复杂度用解法二
public int numDecodings(String s) {
if(s.length() == 0 || s.charAt(0) == '0')
return 0;
int[] ways = new int[s.length() + 1];
Arrays.fill(ways, 0);
ways[0] = 1;
ways[1] = 1;
for (int i = 1; i < s.length(); i++) {
int digit1 = s.charAt(i - 1) - '0';
int digit2 = s.charAt(i) - '0';
if((digit1 == 1) || (digit1 == 2 && digit2 < 7)) {
if(digit2 == 0)
ways[i + 1] = ways[i - 1];
else
ways[i + 1] = ways[i] + ways[i - 1];
} else {
if(digit2 != 0)
ways[i + 1] = ways[i];
else {
return 0;
}
}
}
return ways[ways.length - 1];
}
//解法二
// 256 / 256 test cases passed.
// Status: Accepted
// Runtime: 224 ms
// Submitted: 0 minutes ago
//时间复杂度O(n) 空间复杂度O(1)
public int numDecodings1(String s) {
if(s.length() == 0 || s.charAt(0) == '0')
return 0;
int pre = 1;
int cur = 1;
for (int i = 1; i < s.length(); i++) {
int digit1 = s.charAt(i - 1) - '0';
int digit2 = s.charAt(i) - '0';
if((digit1 == 1) || (digit1 == 2 && digit2 < 7)) {
int temp = cur;
if(digit2 == 0)
cur = pre;
else
cur += pre;
pre = temp;
} else {
if(digit2 != 0)
pre = cur;
else
return 0;
}
}
return cur;
}
// //解法三 超时 递归
// public int numDecodings3(String s) {
// if(s.length() == 0)
// return 0;
// return numDecodings(s, 0);
// }
// public int numDecodings(String s, int i) {
// if(i == s.length()) {
// return 1;
// }
// int count = 0;
// int digit1 = s.charAt(i) - '0';
// if (i + 1 < s.length()) {
// int digit2 = s.charAt(i + 1) - '0';
// if (digit2 != 0)
// count += numDecodings(s, i + 1);
// if((digit1 == 1) || (digit1 == 2 && digit2 < 7))
// count += numDecodings(s, i + 2);
// }
// return count;
// }
public static void main(String[] args) {
}
}