当前位置: 首页 > news >正文

数据结构与算法--数字转字符串方法数

规定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));
    }
}

相关文章:

  • 数据结构之栈(C语言)
  • RabbitMQ实现路由模式发送接收消息
  • “零拷贝”(Zero-Copy)技术详解以及使用场景
  • 内网渗透-端口转发
  • 【NLP 40、文本生成任务】
  • 【AI大模型】搭建本地大模型GPT-NeoX:详细步骤及常见问题处理
  • 通往自主智能之路:探索自我成长的AI
  • 图像处理全流程指南(OpenCV 实现)
  • 2025-03-23 学习记录--C/C++-C语言 sprintf()实现将多个值按指定格式拼接成字符串
  • 国产达梦(DM)数据库的安装(Linux系统)
  • 设计模式:创建型、结构型、行为型
  • Linux 系统运行 Android 应用的几种方案
  • 为什么EasyExcel能处理大数据量而不内存溢出,EasyExcel原理
  • Linux__之__基于UDP的Socket编程网络通信
  • LLaMA-Factory微调大模型
  • 网络爬虫-4:jsonpath+实战
  • 一个轻量级的 SQLite ORM 工具包
  • c++测试题
  • C# 反射(Reflection)详解
  • Java EE(16)——网络原理——TCP协议解析二
  • 孙简任吉林省副省长
  • 沙县小吃中东首店在沙特首都利雅得开业,首天营业额5万元
  • 6连败后再战萨巴伦卡,郑钦文期待打出更稳定发挥
  • 外交部:中方期待印巴巩固和延续停火势头,避免冲突再起
  • 城事 | 重庆新增热门打卡地标,首座熊猫主题轨交站亮相
  • 学习时报头版:世界要公道不要霸道