九 网站建设日程表渠道策略的四种方式
规定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));}
}