动态规划练习——规定1和A对应、2和B对应、3和C对应…那么一个数字字符串比如“111”就可以转化为:‘AAA“、 “KA“和“AK”。给定一个只有数字字符组成的字符串str,返回有多少种转化结果

简介: 动态规划练习

题目

规定1和A对应、2和B对应、3和C对应…那么一个数字字符串比如"111”就可以转化为:'AAA"、 “KA"和"AK”。给定一个只有数字字符组成的字符串str,返回有多少种转化结果

动态规划关键在于暴力解是否能够顺利写出来,也就是说把尝试过程想清楚后,再将其替换成结构化的缓存结构,所以尝试过程很重要。这个题的暴力解请看这篇博客——暴力递归——从左往右的尝试模型1,Facebook面试真题,。博主多次讲到过,改动态规划的过程跟原题意已经没有关系了,也就是说跟原题意已经解耦了。

所以,如果你看懂了暴力尝试的方法后,我们就直接在此基础上改动态规划:

public static int dpways1(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') {
                dp[i]=0;
            }else if(str[i]=='1') {
                dp[i]=dp[i+1];
                if(i+1<N) {
                    dp[i]+=dp[i+2];
                }
            }else if(str[i]=='2') {
                dp[i]=dp[i+1];
                if(i+1<N && (str[i+1]>='0' && str[i+1]<='6')) {
                    dp[i]+=dp[i+2];
                }
            }else {
                dp[i]=dp[i+1];
            }
        }
        return dp[0];
    }

至于如果你要问为什么要这么改的话,那就将两种方法对比一看就知道啦!其实没有为什么,就是照着暴力尝试的过程无脑改就行。

完整代码:

package com.harrison.class13;

public class Code04_ConvertToString {
    public static int process1(char[] str,int i) {
        if(i==str.length) {
            return 1;
        }
        if(str[i]=='0') {
            return 0;
        }
        if(str[i]=='1') {
            int res=process1(str, i+1);
            if(i+1<str.length) {
                res+=process1(str, i+2);
            }
            return res;
        }
        if(str[i]=='2') {
            int res=process1(str, i+1);
            if(i+1<str.length && (str[i+1]>='0' && str[i+1]<='6')) {
                res+=process1(str, i+2);
            }
            return res;
        }
        return process1(str, i+1);
    }
    
    public static int convert1(String s) {
        if(s==null || s.length()==0) {
            return 0;
        }
        char[] str=s.toCharArray();
        return process1(str, 0);
    }
    
    public static int dpways1(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') {
                dp[i]=0;
            }else if(str[i]=='1') {
                dp[i]=dp[i+1];
                if(i+1<N) {
                    dp[i]+=dp[i+2];
                }
            }else if(str[i]=='2') {
                dp[i]=dp[i+1];
                if(i+1<N && (str[i+1]>='0' && str[i+1]<='6')) {
                    dp[i]+=dp[i+2];
                }
            }else {
                dp[i]=dp[i+1];
            }
        }
        return dp[0];
    }
    
    public static void main(String[] args) {
        String test="11111";
        System.out.println(convert1(test));
        System.out.println(dpways1(test));
    }
}

在这里插入图片描述

相关文章
|
2月前
|
移动开发 小程序 JavaScript
uniapp
uniapp
675 130
|
存储 Linux C++
网易面试:手撕定时器
网易面试:手撕定时器
262 1
|
4月前
|
机器学习/深度学习 人工智能 运维
什么是ai智能?AI的九年飞跃史:从AlphaGo到Agent智能体
2025年,AI已深入生活与产业,从“大模型”到“智能体”,技术实现跃迁。智能体具备记忆、工具调用、任务规划与反馈能力,推动AI从“问答”走向“执行”。推理成本下降使AI平民化,落地场景集中在流程自动化与认知决策。但幻觉、责任归属与长程任务仍是挑战。未来将向多模态、端侧计算与联邦智能体发展。
|
6月前
|
NoSQL Redis
跨redis迁移数据的增量迁移方案和工具
面对这个不能完全覆盖的需求,使用RDB备份的需求是无法满足,因为RDB文件会将B的全部数据改为A的数据,显然是不可行的。后来我用了yunedit-redis,这款客户端工具,完美实现了数据的迁移,而且全程都在客户端操作,无需通过编码的方式来实现。
261 1
|
5月前
|
存储 设计模式 IDE
从基础到高级的 Java 学习资料全面汇总
本文汇总了Java学习的全面资料,涵盖Java基础、面向对象编程、核心知识、高级特性及常用框架,如Spring和Hibernate。内容包括技术详解、代码实例及学习资源推荐,助力从入门到精通Java编程,适合各阶段学习者参考。
291 0
|
8月前
|
Java
【源码】【Java并发】【AQS】从ReentrantLock、Semaphore、CutDownLunch、CyclicBarrier看AQS源码
前言 主播觉得,AQS的原理,就是通过这2个队列的协助,实现核心功能,同步队列(CLH队列)和条件队列(Condition队列)。 同步队列(CLH队列) 作用:管理需要获...
167 18
【源码】【Java并发】【AQS】从ReentrantLock、Semaphore、CutDownLunch、CyclicBarrier看AQS源码
|
8月前
|
机器学习/深度学习 人工智能 自动驾驶
企业内训|模拟AI场景课程——某汽车厂商
4月18日和19日,东北某市,TsingtaoAI团队为某汽车厂商的智能驾驶业务和研发团队交付“模拟AI场景课程”。本课程基于该厂商在AI领域的战略布局,结合汽车行业智能化转型趋势,以“场景化、实战化、前瞻性”为核心,聚焦AI技术从理论到落地的全链路。通过模拟真实业务场景(如智能座舱优化、智能制造、自动驾驶仿真),帮助学员掌握AI基础能力,并快速应用于研发、生产、营销等环节。
316 4
|
12月前
|
存储 机器学习/深度学习 人工智能
《Python 助力:人工智能模型的“瘦身”与“加速”之旅》
在人工智能蓬勃发展的今天,深度学习模型的规模和复杂度不断增加,导致存储需求大、计算资源消耗过多及推理速度受限等问题。为此,模型压缩(如剪枝、低秩分解)和量化技术应运而生,通过减少参数数量或降低精度,在不显著影响性能的前提下,优化存储和计算效率。Python 作为主流编程语言,在这些技术的实现与优化中发挥重要作用,借助 TensorFlow 和 PyTorch 等框架,开发者可以方便地进行模型压缩和量化操作。这些技术不仅提高了模型在边缘设备上的运行效率,还降低了数据中心的存储和能耗成本,推动了人工智能的广泛应用。
318 82
|
10月前
|
安全 前端开发 开发工具
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
509 5
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
|
存储 人工智能 编译器
【AI系统】自动微分的挑战&未来
本文详细探讨了自动微分的原理与实现,包括其在AI框架中的应用实例,指出自动微分技术面临的两大挑战——易用性和高效性能。文章分析了数学表达与程序表达间的差异对自动微分实现的影响,讨论了控制流表达、复杂数据类型、语言特性的处理难题,以及物理系统模拟对自动微分的需求。此外,还探讨了提高自动微分性能的方法,如合理选择中间结果存储点以平衡内存占用与运行速度。最后展望了自动微分的未来发展,特别是可微编程的概念及其在AI领域的应用前景。
267 7