程序员代码面试指南刷题--第四章.数字字符转化为字母组合的种数

题目描述
给定一个字符串str,str全部由数字字符组成,如果str中的某一个或者相邻两个字符组成的子串值在1~26之间,则这个子串可以转换为一个字母。规定‘1’转换为“A”,“2”转换为“B”…"26"转化为“Z“。请求出str有多少种不同的转换结果,由于答案可能会比较大,所以请输出对10^9+7取模后的答案。
输入描述:

输出一行仅有’0‘~’9‘组成的字符串,代表str (0≤length(str)≤100000)

输出描述:

输出一个整数,代表你所求出的取模后答案。

示例1

输入

1111

输出

5

说明

能转换出来的结果有:“AAAAA”,“LAA”,“ALA”,“AAL”,“LL”。

示例2

输入

01

输出

0

说明

“0”没有对应的字符,而“01”是不可转换的。

解法一:动态规划

思路: 递归自己测能跑通,但是一提交就完犊子改成动态规划倒是可以了,奇了怪了

import java.io.*;
import java.util.*;
public class Main{
    public static void main(String[] args)throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine().trim();
        getRes(s);
    }
    public static void getRes(String s){
        if(s==null||s.equals("")){
            System.out.println(0);
            return;
        } 
        char[] chars = s.toCharArray();
        int len = chars.length;
        long[] dp = new long[len+1];
        dp[len] = 1;
        for(int i=len-1;i>=0;i--){
            if(chars[i]=='0'){
                dp[i] = 0;
            }else{
                dp[i] = dp[i+1];
                if(i<len-1&&(chars[i]-'0')*10+chars[i+1]-'0'<27){
                    dp[i] += dp[i+2];
                }
                dp[i] %= 1000000007;
            }    
        }
        System.out.println((int)dp[0]);
    }
    //我日了 为啥单独递归跑不通。。。
    public static int get(char[] arr,int i){
        if(i==arr.length) return 1;
        if(arr[i]=='0') return 0;
        long res = get(arr,i+1);
        if(i<arr.length-1&&(arr[i]-'0')*10+arr[i+1]-'0'<27){
            res += get(arr,i+2);
            res %= 1000000007;
        }
        return (int)res;
    }
}

你可能感兴趣的:(程序员代码面试指南刷题)