1. // 模型1:从左向右尝试模型
    2. /**
    3. * 规定1-26与 a-k一一对应,那么给定一个数字字符组成的字符串str,返回有多少种转化结果
    4. * eg: ’111‘ 可以转化为 AAA,KA,AK
    5. */
    6. public class Code02_ConvertToLetterString {
    7. // str只含有数字字符0~9
    8. // 返回多少种转化方案
    9. public static int number(String str) {
    10. if (str == null || str.length() == 0) {
    11. return 0;
    12. }
    13. return process(str.toCharArray(), 0);
    14. }
    15. // str[0..i-1]上已经转化无需过问
    16. // str[i.....]去转化,返回有多少种转化方法,从index出发,后面所有的数字字符串转化完,有几种结果
    17. public static int process(char[] str, int i) {
    18. if (i == str.length) {
    19. return 1;
    20. }
    21. // i没到最后,说明有字符
    22. if (str[i] == '0') { // 之前的决定有问题
    23. return 0;
    24. }
    25. // str[i] != '0'
    26. // 可能性一,i位置字符独单转换,然后计算下一个位置(i+1位置)多少转换方案
    27. int ways = process(str, i + 1);
    28. // 可能性二,i位置和i+1位置的字符共同构成一个进行转换
    29. if (i + 1 < str.length && (str[i] - '0') * 10 + (str[i + 1] - '0') < 27) {
    30. ways += process(str, i + 2);
    31. }
    32. return ways;
    33. }
    34. public static int dp(String s) {
    35. if (s == null || s.length() == 0) {
    36. return 0;
    37. }
    38. char[] str = s.toCharArray();
    39. int N = str.length;
    40. int[] dp = new int[N + 1];
    41. dp[N] = 1;
    42. for (int i = N - 1; i >= 0; i--) {
    43. if (str[i] != '0') {
    44. int ways = dp[i + 1];
    45. if (i + 1 < str.length && (str[i] - '0') * 10 + str[i + 1] - '0' < 27) {
    46. ways += dp[i + 2];
    47. }
    48. dp[i] = ways;
    49. }
    50. }
    51. return dp[0];
    52. }
    53. public static void main(String[] args) {
    54. // System.out.println(number("7210231231232031203123"));
    55. // System.out.println(dp("7210231231232031203123"));
    56. System.out.println('7'-'0');
    57. }
    58. }