题目描述:
一条包含字母 A-Z 的消息通过以下方式进行了编码:
‘A’ -> 1
‘B’ -> 2
…
‘Z’ -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。
样例:
输入: “226”
输出: 3
解释: 它可以解码为 “BZ” (2 26), “VF” (22 6), 或者 “BBF” (2 2 6) 。
输入: “026”
输出: 0
分析:
这道题和把数字翻译成字符串那道题类似,只是不再对数字0编码,所以我们在边界条件的判定时要注意。
首先考虑特殊情况,当字符串长度小于1或者字符串的首字符是0时返回0;否则当字符长度为1时返回1.
然后处理一般情况,保存当前字符的最大翻译次数,以及前一个字符和前前一个字符的最大翻译次数,如果当前字符为0,判断他的前一个字符是否也为0或者大于2,这种情况直接返回0,无法解码;否则令cur=前前一个字符的最大翻译次数。如果当前字符不为0,首先将前一个字符的最大翻译次数赋给当前字符即cur=before,然后判断当前字符和前一个字符组成的数字是否在1-26区间中,如果满足cur继续累加pre。
//执行用时 : 3 ms, 在Decode Ways的Java提交中击败了75.57% 的用户
//内存消耗 : 34.4 MB, 在Decode Ways的Java提交中击败了49.25% 的用户
public int numDecodings(String s) {
if(s.length() < 1 || s.charAt(0) == '0')
return 0;
if(s.length()==1)
return 1;
int pre=1,before=1,cur=0;
for(int i=1;i<s.length();i++) {
if(s.charAt(i)=='0') {
if(s.charAt(i-1)=='0'||s.charAt(i-1)>'2')
return 0;
cur=pre;
}else {
cur=before;
if(s.charAt(i-1)=='1'||s.charAt(i-1)=='2'&&s.charAt(i)<='6')
cur+=pre;
}
pre=before;
before=cur;
}
return cur;
}
public int numDecodings2(String s) {
if(s.length() < 1 || s.charAt(0) == '0')
return 0;
if(s.length()==1)
return 1;
int n = s.length();
int dp[]=new int[n+1];
dp[0]=1;
if(s.charAt(1)=='0')
dp[1]=0;
else
dp[1]=1;
for(int i=1;i<n;i++) {
if(s.charAt(i)=='0') {
if(s.charAt(i-1)>'2'||s.charAt(i-1)==0)
return 0;
dp[i+1]=dp[i-1];
}else {
dp[i+1]=dp[i];
if(s.charAt(i-1)=='1' || (s.charAt(i-1)=='2' && s.charAt(i)<='6'))
dp[i+1]+=dp[i-1];
}
}
return dp[s.length()];
}

博客围绕包含数字的非空字符串解码方法总数的计算展开。给出编码规则,如 'A' 对应 1 等。通过样例展示不同输入的解码结果,还对解题进行分析,考虑特殊情况和一般情况,给出判断条件和计算逻辑。
305

被折叠的 条评论
为什么被折叠?



