O(N), O(N) dp

可以优化空间复杂度为O(1),

先可以考虑问题中不含有0的情况例如1223

1223的个数 = 122的个数 + 12的个数*(23 <= 26 ? 1 : 0);

新建dp, dp[i]表示以nums[i]结尾的字符串的译码结果的个数;

所以可以得到递推公式dp[i] = dp[i-1] + dp[i-2] (判断为1或0); (所以空间复杂度可以优化,不用一个数组存储,只需要两个指针),初始化dp[0], dp[1];

然后加入0,首先应该明确两个相邻的0,是一定不可的,直接返回0

然后当nums[i]为0时,> 20 也不可,没有对应的字母,返回0;

特别注意,10,20 时,此时,dp[i] = dp[i-2]; 因为0没有对应的字母;

	import java.util.*;

    public class Solution {
        /**
         * 解码
         * @param nums string字符串 数字串
         * @return int整型
         */
	public int solve (String nums) {
    // write code here
    //0-9, 0的情况
    //dp[i]表示以nums[i]结尾的字符串的译码结果的个数
    
    int[] dp = new int[nums.length()];
    //初始化
    dp[0] = nums.charAt(0) == '0' ? 0 : 1;
    if(nums.length() == 1) return dp[0];
    
    if(nums.charAt(1) != '0' ) dp[1] = dp[0];//加一位数
    int a =  Integer.parseInt("" + nums.charAt(0) + nums.charAt(1));
    if(a >= 10 && a <= 26) dp[1] ++;//一个两位数
    
    for(int i = 2; i < nums.length(); i++){
        if(nums.charAt(i) == '0'){
            if(nums.charAt(i-1) == '0') return 0;//找不到译码
            if(nums.charAt(i-1) > '2') return 0;//找不到译码
            else dp[i] = 0;//10, 20 mark
        }else{
            dp[i] = dp[i - 1];
        }
        
        int tmp = Integer.parseInt("" + nums.charAt(i-1) + nums.charAt(i));
        if(tmp >= 10 && tmp <= 26){
            dp[i] += dp[i-2];
        }
    }
    
    return dp[nums.length() - 1];
}
}