题目来源:https://leetcode.com/problems/decode-ways/
问题描述
91. Decode Ways
Medium
A message containing letters from A-Z is 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.
Example 1:
Input: "12"
Output: 2
Explanation: It could be decoded as "AB" (1 2) or "L" (12).
Example 2:
Input: "226"
Output: 3
Explanation: It could be decoded as "BZ" (2 26), "VF" (22 6), or "BBF" (2 2 6).
------------------------------------------------------------
题意
规定大写英文字母与数字字符串的对应关系如下:
“A” -> “1”
“B” -> “2”
…
“Z” -> “26”
给出一个数字字符串s,求字符串有多少种不同的英文字母编码表示。
------------------------------------------------------------
思路
递推。用dp[i]表示s[0:i]的英文编码种数,
dp[i] = dp[i-1]+dp[i-2], s[i-1:i] == “11” ~ “26”
dp[i-1], s[i-1:i] == 大于26且没有0的数字
dp[i-2], s[i-1:i] == “10”, “20”
dp[i-1], s[i-1:i] == “01” ~ “09”
return 0, s[i-1:i] == “00”, “30” ~ “90”
------------------------------------------------------------
代码
class Solution {
public int numDecodings(String s) {
int n = s.length();
if (s == null || n == 0)
{
return 0;
}
int dp = 0, dp1 = 0, dp2 = 1;
if (s.charAt(0) == '0')
{
dp1 = 0;
}
else
{
dp1 = 1;
}
if (n == 1)
{
return dp1;
}
for (int i=1; i<n; i++)
{
if (s.charAt(i-1) == '0' && s.charAt(i) == '0')
{
return 0;
}
else if (s.charAt(i-1) == '0')
{
dp = dp1;
}
else if (s.charAt(i) == '0' && s.charAt(i-1) >= '3')
{
return 0;
}
else if (s.charAt(i) == '0')
{
dp = dp2;
}
else
{
Integer tmp = Integer.parseInt(s.substring(i-1, i+1));
if (tmp>=11 && tmp<=26)
{
dp = dp1+dp2;
}
else
{
dp = dp1;
}
}
dp2 = dp1;
dp1 = dp;
}
return dp;
}
}