/** * 递推公式倒是不难,主要是里面的0这个搅屎棍情况有点多,最核心的问题 * 0 不能单独出现,只能是10或者20 * 那么0的限制就有以下几个 * 1 0 不能出现在首位,露头就洗白 * 2 要是0与前一个数字合起来的数值大于20也不行 * 另外对于非0相关的话有个限制就是两个字符合起来的数值不能超过26,超过就只能单飞 * * @param nums * @return */ public int solve(String nums) { // write code here if (nums == null) { return 0; } if (nums.indexOf('0') == 0) { return 0; } int[] dp = new int[nums.length()]; for (int i = 0; i < dp.length; i++) { if (i == 0) { dp[i] = 1; } else { int num1 = Integer.parseInt(nums.substring(i - 1, i)); int num2 = Integer.parseInt(nums.substring(i, i + 1)); int tmp = Integer.parseInt(nums.substring(i - 1, i + 1)); //0的限制,,出现两个0 if (tmp == 0) { return 0; } // 出现30等情况 if (num2 == 0 && tmp > 20) { return 0; } // 各种单飞的情况 if (tmp > 26 || num2 == 0 || num1 == 0) { dp[i] = dp[i - 1]; } else { if (i == 1) { dp[i] = 2; } else { dp[i] = dp[i - 1] + dp[i - 2]; } } } } return dp[nums.length() - 1]; }