题目
有一种将字母编码成数字的方式:'a'->1, 'b->2', ... , 'z->26'。
现在给一串数字,返回有多少种可能的译码结果。
数据范围:字符串长度满足 0<n≤90。
进阶:空间复杂度 O(n),时间复杂度 O(n)。
示例1
输入:
"12"
返回值:
2
说明:
2种可能的译码结果(”ab” 或”l”)
示例2
输入:
"31717126241541717"
返回值:
192
说明:
192种可能的译码结果
代码
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 解码
* @param nums string字符串 数字串
* @return int整型
*/
public int solve (String nums) {
int n = nums.length();
//将字符串转化为字符数组
char[] s = nums.toCharArray();
//1.创建dp表
int[] dp = new int[n];
//2.初始化
//2.1.处理第一种情况
if(s[0] != '0') {
dp[0] = 1;
}
//处理边界情况
if(n == 1) {
return dp[0];
}
//2.2.处理第二种情况
//单独处理2个位置
if(s[0] != '0' && s[1] != '0') {
dp[1] += 1;
}
//2个位置一起处理
int t = (s[0] - '0') * 10 + (s[1] - '0');
if(t >= 10 && t <= 26) {
dp[1] += 1;
}
//3.填表
for(int i = 2; i < n; i++) {
//3.1.单独解码的情况
if(s[i] != '0') {
dp[i] += dp[i- 1];
}
//3.2.同时解码2个位置的情况
int tt = (s[i- 1] - '0') * 10 + (s[i] - '0');
if(tt >= 10 && tt <= 26) {
dp[i] += dp[i- 2];
}
}
//4.返回值
return dp[n - 1];
}
}