[程序员代码面试指南]递归和动态规划-数字字符串转换为字母组合的种数(DP)

题意

给一个字符串,只由数字组成,若是'1'-'26',则认为可以转换为'a'-'z'对应的字母,问有多少种转换方法。

题解

状态转移很好想,注意dp多开一位,dp[0]为dp[2]的计算做准备。dp[i]表示到索引为i-1的字符(含)为止转换方法数。

代码

public class Main {
    public static void main(String args[]) {
        String str="01";
        System.out.print(transMeans(str));
    }
    
    public static int transMeans(String str) {
        if(str==null||str.length()==0) {
            return 0;
        }
        
        int[] dp=new int[str.length()+1];
        dp[0]=1;
        dp[1]=str.charAt(0)=='0'?0:1;       
        
        if(str.length()!=1) {
            for(int i=2;i<=str.length();++i) {
                dp[i]=dp[i-1]*isLetter(str.charAt(i-1))+dp[i-2]*isLetterWithTwoNum(str,i-1);
            }
        }       
        return dp[str.length()];
    }
    
    public static int isLetter(char c) {
        return c!='0'?1:0;
    }
    
    public static int isLetterWithTwoNum(String s,int i) {
        int num=(s.charAt(i-1)-'0')*10+s.charAt(i)-'0';
        return num>=1&&num<=26&&s.charAt(i-1)!='0'?1:0;
    }
}

猜你喜欢

转载自www.cnblogs.com/coding-gaga/p/11080141.html