难度中等359收藏分享切换为英文关注反馈
一条包含字母 A-Z
的消息通过以下方式进行了编码:
'A' -> 1 'B' -> 2 ... 'Z' -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。
示例 1:
输入: "12" 输出: 2 解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。
示例 2:
输入: "226" 输出: 3 解释: 它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
思路:首先我们可以发现:后一个字母的排列可能性是依据前面的,你比如123。3这个位置有几种变化是根据前面的。1位置只有一种,2位置的话,有两种(一种包括前面的1是1,2.一种是12。)那么3位置同理。所以这种情况解法我会想到动态规划
既然是dp那就离不开状态表达式
从上面可以看出dp[i]取决于dp[i-1],如果还能两位数是小于26的那又要加上dp[i-2];
class Solution {
public int numDecodings(String s) {
int[] dp=new int[s.length()];
if(s.charAt(0)=='0'||s.length()==0)
return 0;
if(s.length()==1)
return 1;
dp[0]=1;
if(s.charAt(1)!='0')
dp[1]=1;
int n=(s.charAt(0)-'0')*10+(s.charAt(1)-'0');
if(n<=26)
dp[1]++;
for(int i=2;i<s.length();i++) {
n=(s.charAt(i-1)-'0')*10+(s.charAt(i)-'0');
if(s.charAt(i)!='0')
dp[i]+=dp[i-1];
if((s.charAt(i)=='0'&&s.charAt(i-1)=='0'))
return 0;
if(s.charAt(i-1)!='0'&&n<=26) {
dp[i]+=dp[i-2];
}
}
// for(int i=0; i<s.length();i++) {
// System.out.println("dp"+dp[i]);
// }
return dp[s.length()-1];
}
}