public class Solution {
/**
* 解码
* @param nums string字符串 数字串
* @return int整型
*/
public int solve (String nums) {
// write code here
if (nums.length() == 0 || nums.charAt(0) == '0') return 0;
// 状态转移式
int[] dp = new int[nums.length()];
dp[0] = 1;
// 如果前置数不是 ‘0’,则开始进行译码工作
for (int i = 1; i < nums.length(); i ++) {
// 如果当前数不为 0, 则 dp[i] = dp[i - 1];
if (nums.charAt(i) != '0') dp[i] = dp[i - 1];
// 判断当前数和前一个数组成的数是否合法
int temp = (nums.charAt(i - 1) - '0') * 10 + (nums.charAt(i) - '0');
if (temp >= 10 && temp <= 26) {
// 判断当前位数是否只有两位,若成立,则 dp[i] += 1
// 防越界 dp[1 - 2] 不合法
if (i == 1) dp[i] ++;
else dp[i] += dp[i - 2];
}
}
return dp[nums.length() - 1];
// return dfs(nums, 0);
}
// public int solve1(String nums) {
// return dfs(nums, 0);
// }
public int dfs(String nums, int start) {
// 若遍历完字符串,则返回 1
if (start == nums.length()) return 1;
// 若当前元素为 0,则返回 0
if (nums.charAt(start) == '0') return 0;
// 遍历求下一个数
int res1 = dfs(nums, start + 1);
int res2 = 0;
// 若前置数为 1 或 前置数为 2 并且 当前数 小于 6,则后移两位继续遍历
if (start + 1 < 26 && (nums.charAt(start) == '1' || (nums.charAt(start) == '2' && nums.charAt(start + 1) <= '6'))) {
res2 = dfs(nums, start + 2);
}
return res1 + res2;
}
}