leetcode 91. 解码方法 [java/动态规划]

69 阅读1分钟
//    假设 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];
    }