|
|
|
@ -30,7 +30,10 @@ public class Code02_ConvertToLetterString {
|
|
|
|
|
return ways;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static int dp(String s) {
|
|
|
|
|
// 从右往左的动态规划
|
|
|
|
|
// 就是上面方法的动态规划版本
|
|
|
|
|
// dp[i]表示:str[i...]有多少种转化方式
|
|
|
|
|
public static int dp1(String s) {
|
|
|
|
|
if (s == null || s.length() == 0) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
@ -50,9 +53,66 @@ public class Code02_ConvertToLetterString {
|
|
|
|
|
return dp[0];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 从左往右的动态规划
|
|
|
|
|
// dp[i]表示:str[0...i]有多少种转化方式
|
|
|
|
|
public static int dp2(String s) {
|
|
|
|
|
if (s == null || s.length() == 0) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
char[] str = s.toCharArray();
|
|
|
|
|
int N = str.length;
|
|
|
|
|
if (str[0] == '0') {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
int[] dp = new int[N];
|
|
|
|
|
dp[0] = 1;
|
|
|
|
|
for (int i = 1; i < N; i++) {
|
|
|
|
|
if (str[i] == '0') {
|
|
|
|
|
if (str[i - 1] == '0' || str[i - 1] > '2' || (i - 2 >= 0 && dp[i - 2] == 0)) {
|
|
|
|
|
return 0;
|
|
|
|
|
} else {
|
|
|
|
|
dp[i] = i - 2 >= 0 ? dp[i - 2] : 1;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
dp[i] = dp[i - 1];
|
|
|
|
|
if (str[i - 1] != '0' && (str[i - 1] - '0') * 10 + str[i] - '0' <= 26) {
|
|
|
|
|
dp[i] += i - 2 >= 0 ? dp[i - 2] : 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return dp[N - 1];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 为了测试
|
|
|
|
|
public static String randomString(int len) {
|
|
|
|
|
char[] str = new char[len];
|
|
|
|
|
for (int i = 0; i < len; i++) {
|
|
|
|
|
str[i] = (char) ((int) (Math.random() * 10) + '0');
|
|
|
|
|
}
|
|
|
|
|
return String.valueOf(str);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 为了测试
|
|
|
|
|
public static void main(String[] args) {
|
|
|
|
|
System.out.println(number("7210231231232031203123"));
|
|
|
|
|
System.out.println(dp("7210231231232031203123"));
|
|
|
|
|
int N = 30;
|
|
|
|
|
int testTime = 1000000;
|
|
|
|
|
System.out.println("测试开始");
|
|
|
|
|
for (int i = 0; i < testTime; i++) {
|
|
|
|
|
int len = (int) (Math.random() * N);
|
|
|
|
|
String s = randomString(len);
|
|
|
|
|
int ans0 = number(s);
|
|
|
|
|
int ans1 = dp1(s);
|
|
|
|
|
int ans2 = dp2(s);
|
|
|
|
|
if (ans0 != ans1 || ans0 != ans2) {
|
|
|
|
|
System.out.println(s);
|
|
|
|
|
System.out.println(ans0);
|
|
|
|
|
System.out.println(ans1);
|
|
|
|
|
System.out.println(ans2);
|
|
|
|
|
System.out.println("Oops!");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
System.out.println("测试结束");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|