首页 > 科技 > LeetCode算法第91题:解码方法

LeetCode算法第91题:解码方法

题目描述:

一条包含字母 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) 。

思路:

这道题目可以使用动态规划的思路来完成,通过定义一个整数数组dp,用dp[i]来表示从字符串 s 的起始位置到 下标i的解码总数,则对字符串 s 的下标i位置的元素的判断有如下两种方式:

1、字符串 s 在下标 i 的元素为 '0',测试还需要判断前一个元素是否也为 '0' 或者 大于 '2',即两个元素组合成的数字是否在10 ~ 26 之间;

2、字符串 s 在下标 i 的元素不为 '0',此时也需要判断该元素和上一元素组合成的数字是否在10 ~ 26 之间;

Java代码:

public int numDecodings(String s) {
if(null == s || s.length() == 0 || s.charAt(0) == '0'){
return 0;
}
int [] result = new int[s.length() + 1];
result[0] = 1;
for(int i = 1; i <= s.length(); i ++){
if(s.charAt(i-1) == '0'){
if(i > 1 && (s.charAt(i - 2) == '0' || Integer.valueOf(s.substring(i-2,i)) > 26)){
return 0;
}
result[i] = result[i - 2];
}else{
if( i > 1){
if(s.charAt(i - 2) == '0'){
result[i] = result[i - 2];
}else{
result[i] = Integer.valueOf(s.substring(i-2,i)) <= 26 ? result[i - 2] + result[i - 1] : result[i - 1];
}
}else{
result[i] = result[i - 1];
}
}
}
return result[s.length()];
}

本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.souzhinan.com/kj/210800.html