您的位置 首页 java

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()];
 }
 

文章来源:智云一二三科技

文章标题:LeetCode算法第91题:解码方法

文章地址:https://www.zhihuclub.com/183184.shtml

关于作者: 智云科技

热门文章

网站地图