动态规划
class Solution {
public int numDecodings(String s) {
if (s.charAt(0) == '0'){
return 0;
}
int n = s.length();
/**
* 定义dp[i]为长度为i的子串解码的总数,字符串为空默认也是一种解法,初始值dp[0] = 1,数组从1开始
* 分以下两种情况:
* 1、i单独解码,条件是s.charAt(i) != '0',此时dp[i] = dp[i - 1]
* 2、i和i - 1一起解码,条件是i >= 2且这个两位数大于等于10小于等于26,此时dp[i] = dp[i - 2]
*/
int[] dp = new int[n + 1];
dp[0] = 1;
for (int i = 1; i <= n; i++) {
if (s.charAt(i - 1) != '0'){
dp[i] += dp[i - 1];
}
if (i >= 2 && s.charAt(i - 2) != '0' && ((s.charAt(i - 2) - '0') * 10 + (s.charAt(i - 1) - '0') <= 26)){
dp[i] += dp[i - 2];
}
}
return dp[n];
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(n)
*/
https://leetcode-cn.com/problems/decode-ways/