法一(动态规划)
/**
* 动态规划
* 1. 确定dp数组以及下标的含义
* dp[i]表示前i个字符解码方法的总数
* 2. 确定递推公式
* (1)s[i - 1]和s[i - 2]均位于[1, 26]
* dp[i] = dp[i-1] + dp[i-2]
* (2)s[i - 1]和s[i - 2]只有一个位于[1, 26]
* s[i - 1]位于[1, 26] dp[i] = dp[i-1]
* s[i - 2]位于[1, 26] dp[i] = dp[i-2]
* (3)s[i - 1]和s[i - 2]都不位于[1, 26]
* dp[i] = 0
* 3. 确定dp数组如何初始化
* dp[0] = 1
* 4. 确定遍历顺序
* 从左到右的顺序遍历即可
*
* @param s
* @return
*/
public int numDecodings(String s) {
int len = s.length();
if (len == 0 || s.charAt(0) == '0') {
return 0;
}
int[] dp = new int[len + 1];
dp[0] = 1; // 初始为1
for (int i = 1; i <= len; i++) {
if (s.charAt(i - 1) == '0') {
dp[i] = 0;
} else {
dp[i] = dp[i - 1];
}
if (i > 1 && (s.charAt(i - 2) == '1' || (s.charAt(i - 2) == '2' && s.charAt(i - 1) <= '6'))) {
dp[i] += dp[i - 2];
}
}
return dp[len];
}
本地测试
/**
* 91. 解码方法
*/
lay.showTitle(91);
Solution91 sol91 = new Solution91();
String s91 = "226";
System.out.println(sol91.numDecodings(s91));