动态规划--状态转移

解码方法

1.题目

2.思路

1)我们定义一个数组dp,其中dp[i]表示字符串s的前i个字符的解码方法总数。初始化时,dp[0]为1,因为空字符串有一种解码方式。dp[1]的值取决于第一个字符是否是'0',如果不是'0',则有一种解码方式,否则没有解码方式。

2)从第三个字符开始遍历字符串s(即i从2开始)。对于每个字符,我们考虑两种可能的解码方式:

  1. 单独解码最后一个字符:如果当前字符不是'0',则它可以单独解码成一个字母。因此,我们可以将dp[i]增加dp[i-1],因为这意味着我们保持之前的解码方式不变,并在末尾添加一个新的解码字符。

  2. 组合解码最后两个字符:我们检查最后两个字符组成的数字是否在10到26之间。如果是,这两个字符可以组合起来解码成一个字母。在这种情况下,我们可以将dp[i]增加dp[i-2],因为这意味着我们不考虑最后一个字符,而是将最后两个字符作为一个整体进行解码,并加上之前的解码方式数。

在遍历完整个字符串后,dp[n](其中n是字符串s的长度)将包含整个字符串的解码方法总数。

3.代码

import java.util.Scanner;public class jiema {//定义方法numDecodings,接收一个字符串s作为参数,返回解码方法的总数public int numDecodings(String s) {if(s==null || s.length()==0 || s.charAt(0)=='0') {return 0;}//定义dp数组,dp[i]表示s的前i个字符的解码方法总数int n=s.length();int[] dp = new int[n+1];//空字符串有一种解码方式dp[0]=1;//第一个字符如果不是‘0’,则有一种解码方式,否则没有dp[1]=s.charAt(0)!='0'?1:0;//从第二个字符开始遍历字符串sfor(int i=2;i<=n;i++) {//情况1:单独解码最后一个字符//如果当前字符不是'0',则可以单独解码成一个字母if(s.charAt(i-1)!='0') {dp[i]+=dp[i-1];}//情况2:组合解码最后两个字符//取最后两个字符组成的数字int twoDigit = Integer.parseInt(s.substring(i-2,i));//如果这个数字在10-26之间,则可以组合解码成一个字母if(twoDigit >= 10&&twoDigit <=26) {dp[i]+=dp[i-2];}}return dp[n];}public static void main(String[] args) {//创建对象jiema solution=new jiema();Scanner scanner=new Scanner(System.in);String s=scanner.nextLine();scanner.close();//调用numDecodings方法int result = solution.numDecodings(s);System.out.println(result);}
}

4.知识

1)s.charAt(0)

在Java中,s.charAt(0) 是一个方法调用,用于获取字符串 s 中位于索引 0 的字符。在Java中,字符串是字符的序列,并且索引是从 0 开始的。因此,s.charAt(0) 会返回字符串 s 的第一个字符。

例如,如果有一个字符串 s = "hello",那么 s.charAt(0) 将返回字符 'h'

这里是 s.charAt(0) 的一些要点:

  • 如果字符串 s 是空的(即 s.length() == 0),那么调用 s.charAt(0) 会抛出一个 StringIndexOutOfBoundsException,因为索引 0 不存在。
  • 如果 s 是 null,那么调用 s.charAt(0) 将会抛出一个 NullPointerException,因为你不能在 null 对象上调用方法。

因此,在调用 s.charAt(0) 之前,通常最好检查字符串 s 是否为空或 null,以避免这些异常。

2)int twoDigit = Integer.parseInt(s.substring(i-2,i));

Integer.parseInt() 方法用于将字符串参数作为有符号的十进制整数进行解析。如果字符串参数以有效的十进制数字序列开始,则该方法将返回该序列表示的整数。

在代码 int twoDigit = Integer.parseInt(s.substring(i-2, i)); 中,s.substring(i-2, i) 创建了一个从字符串 s 的 i-2 位置开始(包含)到 i 位置结束(不包含)的子字符串。这个子字符串包含了 s 的最后两个字符。

3)   Scanner scanner=new Scanner(System.in);
        String s=scanner.nextLine();
        scanner.close();

从键盘获取字符串的代码,导入包import java.util.Scanner;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2808196.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

C/C++暴力/枚举/穷举题目(刷蓝桥杯基础题的进!)

目录 前言 一、百钱买百鸡 二、百元兑钞 三、门牌号码&#xff08;蓝桥杯真题&#xff09; 四、相乘&#xff08;蓝桥杯真题&#xff09; 五、卡片拼数字&#xff08;蓝桥杯真题&#xff09; 六、货物摆放&#xff08;蓝桥杯真题&#xff09; 七、最短路径&#xff08;蓝…

《汇编语言》- 读书笔记 - 实验11 编写子程序

《汇编语言》- 读书笔记 - 实验11 编写子程序 需求思路完整代码效果演示参考资料 需求 编写一个子程序&#xff0c;将包含任意字符&#xff0c;以0结尾的字符串中的小写字母转变成大写字母&#xff0c;描述如下。 名称letterc功能将以0结尾的字符串中的小写字母转变成大写字母…

8-pytorch-损失函数与反向传播

b站小土堆pytorch教程学习笔记 根据loss更新模型参数 1.计算实际输出与目标之间的差距 2.为我们更新输出提供一定的依据&#xff08;反向传播&#xff09; 1 MSEloss import torch from torch.nn import L1Loss from torch import nninputstorch.tensor([1,2,3],dtypetorch.fl…

nginx(二)

nginx的验证模块 输入用户名和密码 第一步先下载httpd 这个安装包 第二步编辑子配置文件 然后去网页访问192.168.68.3/admin/ 连接之后&#xff0c;会出现404&#xff0c;404出现是因为没给网页写页面 如果要写页面&#xff0c;则在/opt/html&#xff0c;建立一个admin&#x…

吴恩达deeplearning.ai:矩阵运算代码实战

神经网络向量化指的是将输入数据转化为向量形式&#xff0c;以便于神经网络的处理。向量化的作用包括以下几点&#xff1a; 提高计算效率&#xff1a;使用向量化的输入数据可以进行并行计算&#xff0c;加速神经网络的训练和推断过程。 减少存储空间&#xff1a;向量化可以将…

C#与VisionPro联合开发——TCP/IP通信

TCP/IP&#xff08;传输控制协议/互联网协议&#xff09;是一组用于在网络上进行通信的通信协议。它是互联网和许多局域网的基础&#xff0c;为计算机之间的数据传输提供了可靠性、有序性和错误检测。在软件开发中&#xff0c;TCP/IP 通信通常用于实现网络应用程序之间的数据交…

改进Yolov5目标检测与单目测距 yolo速度测量-pyqt界面-yolo添加注意力机制

当设计一个结合了 YOLOv5 目标检测、单目测距与速度测量以及 PyQt 界面的毕业设计时&#xff0c;需要考虑以下几个方面的具体细节&#xff1a; 计算机视觉、图像处理、毕业辅导、作业帮助、代码获取&#xff0c;私聊会回复! YOLOv5 目标检测&#xff1a; 首先&#xff0c;选择…

汇编反外挂

在软件保护领域&#xff0c;尤其是游戏保护中&#xff0c;反外挂是一个重要的议题。外挂通常指的是一种第三方软件&#xff0c;它可以修改游戏数据、操作游戏内存或提供其他作弊功能&#xff0c;从而给玩家带来不公平的优势。为了打击外挂&#xff0c;游戏开发者会采取一系列措…

H5元素形变

H5元素形变 一、缩放 语法&#xff1a; ​ transform:scale(缩放倍率) //整体缩放 ​ transform:scale(水平缩放倍率&#xff0c;垂直缩放倍率) //单独设置水平和垂直方向的缩放 ​ transform: scaleX(缩放倍率) //沿X轴缩放 ​ transform: scaleY(缩放倍率) //沿Y轴缩放…

Unity类银河恶魔城学习记录7-8 P74 Pierce sword源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Sword_Skill.cs using System; using System.Collections; using System.C…

杰理701N可视化SDK之LED的配置和代码浅析

杰理701N可视化SDK LED的配置 LED硬件配置LED状态配置LED状态情景配置LED在SDK中相关代码 杰理可视化工具中可以配置LED的硬件配置和LED状态配置, 在可视化工具中的LED配置选项中设置 LED硬件配置 硬件配置可设置LED名, 推LED使用的IO口以及LED的点亮方式 SDK发布的标准原理…

Ubuntu中添加和修改Apt Repository

使用Ubuntu Software Center或 apt/apt-get等命令行工具安装软件包时&#xff0c;软件包是从一个或多个 apt 软件库&#xff08;software repositories&#xff09;下载的。APT repository是一个网络服务器或本地目录&#xff0c;其中包含可被 APT 工具读取的 deb 软件包和元数…

Linux之项目部署与发布

目录 一、Nginx配置安装&#xff08;自启动&#xff09; 1.一键安装4个依赖 2. 下载并解压安装包 3. 安装Nginx 4. 启动 nginx 服务 5. 对外开放端口 6. 配置开机自启动 7.修改/etc/rc.d/rc.local的权限 二、后端部署tomcat负载均衡 1. 准备2个tomcat 2. 修改端口 3…

Linux笔记之LD_LIBRARY_PATH详解

Linux笔记之LD_LIBRARY_PATH详解 code review! 文章目录 Linux笔记之LD_LIBRARY_PATH详解1.常见使用命令来设置动态链接库路径2.LD_LIBRARY_PATH详解设置 LD_LIBRARY_PATH举例注意事项 3.替代方案使用标准路径编译时指定链接路径优先使用 rpath 还是 runpath&#xff1f;注意…

嵌入式软件分层设计的思想分析

“嵌入式开发&#xff0c;点灯一路发” 那今天我们就以控制LED闪烁为例&#xff0c;来聊聊嵌入式软件分层: ——————————— | | | P1.1 |-----I<|--------------<| | | | P2.1 |-------------/ ---------…

【JavaEE】_synchronized关键字——监视器锁monitor lock

目录 1. synchronized的特性 2. synchronized的使用 3. Java标准库中的线程安全类 1. synchronized的特性 &#xff08;1&#xff09;互斥&#xff1a; 前文已经介绍&#xff0c;某个线程执行到某个对象的synchronized中时&#xff0c;其他线程如果也执行到同一个对象&…

Git笔记——4

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、操作标签 二、推送标签 三、多人协作一 完成准备工作 协作开发 将内容合并进master 四、多人协作二 协作开发 将内容合并进master 五、解决 git branch -a…

第十二章 Linux——日志管理

第十二章 Linux——日志管理 基本介绍系统常用日志日志管理服务日志轮替基本介绍日志轮替文件命名logrotate配置文件自定义加入日志轮转应用实例 日志轮替机制原理查看内存日志 基本介绍 日志文件是重要的系统信息文件&#xff0c;其中记录了许多重要的系统事件&#xff0c;包…

【操作系统】磁盘文件管理系统

实验六 磁盘文件管理的模拟实现 实验目的 文件系统是操作系统中用来存储和管理信息的机构&#xff0c;具有按名存取的功能&#xff0c;不仅能方便用户对信息的使用&#xff0c;也有效提高了信息的安全性。本实验模拟文件系统的目录结构&#xff0c;并在此基础上实现文件的各种…

[c++] 工厂模式 + cyberrt 组件加载器分析

使用对象的时候&#xff0c;可以直接 new 一个&#xff0c;为什么还需要工厂模式 &#xff1f; 工厂模式属于创建型设计模式&#xff0c;将对象的创建和使用进行解耦&#xff0c;对用户隐藏了创建逻辑。 个人感觉上边的表述并没有说清楚为什么需要使用工厂模式。因为使用 new 创…