[程序员代码面试指南]递归和动态规划-数字字符串转换为字母组合的种数(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;
}
}
posted on 2019-06-24 23:09 coding_gaga 阅读(577) 评论(0) 编辑 收藏 举报