有一种将字母编码成数字的方式:'a'->1, 'b->2', ... , 'z->26'。

现在给一串数字,返回有多少种可能的译码结果

输入:"12"

返回值:2种可能的译码结果(”ab” 或”l”)

其实这道题目很像爬楼梯,一次能爬一层和爬两层,只是爬的过程中增加了一些限定条件,只要将这些限定条件屡清楚则可以完全搞懂这类题目

dp[i]:表示前i个字符有多少种译码结果

dp[i]=dp[i-1](如果最后一个字符是合法编码)+dp[i-2](如果最后两个字符是合法编码)

dp[0]=1;

dp[1]=1(且nums.charat[0]!='0')

public int solve (String nums) {
        // write code here
        int length=nums.length();
        int[] dp=new int[length+1];
        dp[0]=1;
        for(int i=1;i<=length;i++){
            if(nums.charAt(i-1)!='0')
                dp[i]+=dp[i-1];
            if(i>=2&&(nums.charAt(i-2)-'0')*10+(nums.charAt(i-1)-'0')>=10&&(nums.charAt(i-2)-'0')*10+(nums.charAt(i-1)-'0')<=26)
               dp[i]+=dp[i-2];
        }
        return dp[length];
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.