[程序员代码面试指南]递归和动态规划-数字字符串转换为字母组合的种数(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编辑  收藏  举报

导航