// 假设 fn ,那么当i 选择一次的时候,即i != 0 fn = fn -1;例子 666 只有一次
// 当i 位置可以选择两次时,(i - 1) * 10 + i <= 26 时必须满足的,那么此时的i 等于 fn = fn -2;
// fn = 0时,没有 fn -1,且当fn = 0 值不为0的时候,应该有一次返回值
// 那么将dp设置的大小设置为n+1 ,在fn = 0,之前设置一个状态为1,当fn = 0 的时候可以 fn += n -1;(由于dp【n】 初始值为0,所以等价于fn = fn -1)
// 那么fn = fn -2 等价替换为 fn += fn -2;
public int f(String s){
int n = s.length();
int[] dp = new int[n + 1];//构建一个大于s的dp
dp[0] = 1;//因为空串相当于有一种,所以在dp的最前面我们基于初始值1
for (int i = 1; i <= n; ++i) {
if (s.charAt(i - 1) != '0') {// 不为0 可选择的时 前一个值 如 666 只能有一种
dp[i] = dp[i - 1];
}
// 有两种选择,走法 ++ 如 12,1 2, 12 两种当 12 选择的时候,那么就 12之前的走法数 + 12 位置数
// i 和i -1 为一组, 所以 i位置 等于 【i】 + 【i -2】的值
if (i > 1 && 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];
}