数据结构与算法--数字转字符串方法数
规定1对应A , 2对应B , 3对应C, 依此类推26对应Z。 那么一个数字字符串, 比如111就可以转化为AAA , KA, Ak.
给定一个只有数字字符组成的字符串str返回有多少种转化结果
public class Code02_ConvertToLetterString {
// str只含有数字字符0~9
// 返回多少种转化方案
public static int number(String str) {
int ans = process(str,0);
return ans;
}
public static int process(String str, int index){
if(index >= str.length()){
return 1;
}
int a = 0;
// 直接翻译
if(str.charAt(index) != '0') {
a = process(str, index+1);
}
// 使用下一个
if((str.charAt(index) == '1' && (index+1) <str.length())
||
(str.charAt(index) == '2' && (index+1) <str.length() && str.charAt(index+1) <= '6')) {
a += process(str, index+2);
}
return a;
}
public static int dp(String str) {
int[] dp = new int[str.length()+1];
dp[str.length()] = 1;
for (int i = dp.length-2; i >=0 ; i--) {
int a = 0;
// 直接翻译
if(str.charAt(i) != '0') {
a = dp[i+1];
}
if((str.charAt(i) == '1' && (i+1) <str.length())
||
(str.charAt(i) == '2' && (i+1) <str.length() && str.charAt(i+1) <= '6')) {
a += dp[i+2];
}
dp[i] = a;
}
return dp[0];
}
// 从右往左的动态规划
// 就是上面方法的动态规划版本
// dp[i]表示:str[i...]有多少种转化方式
public static int dp1(String s) {
if (s == null || s.length() == 0) {
return 0;
}
char[] str = s.toCharArray();
int N = str.length;
int[] dp = new int[N + 1];
dp[N] = 1;
for (int i = N - 1; i >= 0; i--) {
if (str[i] != '0') {
int ways = dp[i + 1];
if (i + 1 < str.length && (str[i] - '0') * 10 + str[i + 1] - '0' < 27) {
ways += dp[i + 2];
}
dp[i] = ways;
}
}
return dp[0];
}
public static void main(String[] args) {
String str = "2457245495310113452023";
System.out.println(number(str));
System.out.println(dp(str));
System.out.println(dp1(str));
}
}