动态规划--状态转移

解码方法

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;
		//从第二个字符开始遍历字符串s
		for(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;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode234.回文链表

题目 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true思路 找到链表的中间节点&#xff1a;可以使用快慢指针…

platform(驱动层+应用层)实现终端和中断开关点灯

设备树文件添加 myplatform{compatible"hqyj,myplatform";interrupt-parent<&gpiof>;interrupts<8 0>,<7 0>,<9 0>;led1-gpio<&gpioe 10 0>;led2-gpio<&gpiof 10 0>;led3-gpio<&gpioe 8 0>;reg<0x123…

锂电池SOC估计 | PyTorch实现基于Basisformer模型的锂电池SOC估计

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 PyTorch实现基于Basisformer模型的锂电池SOC估计 锂电池SOC估计&#xff0c;全新【Basisformer】时间序列预测 1.采用自适应监督自监督对比学习方法学习时序特征&#xff1b; 2.通过双向交叉注意力机制计算历史序列和…

从源码学习static的使用

从源码学习static的使用 前言 ​ static意味静态的&#xff0c;在Java中&#xff0c;主要用来修饰类级别的变量或方法等&#xff0c;被修饰的内容&#xff0c;表示随着类的加载而加载&#xff0c;而不是具体的实例级别。 ​ 具体到static的使用场景&#xff0c;主要有以下用…

java 并发的三大特性

CPU 三级缓存架构 为平衡CPU与主存的处理速度问题&#xff0c;提出在CPU中设置多级缓存机制。 当CPU要读取一个数据时&#xff0c;首先从一级缓存中查找&#xff0c;如果没有找到再从二级缓存中查找&#xff0c;如果还是没有就从三级缓存或内存中查找。 每个核心都含有一套L…

高频面试题整理(一)

文章目录 平台无关性如何实现&#xff1f;JVM如何加载 .class文件&#xff1f;什么是反射?谈谈ClassLoader谈谈类的双亲委派机制类的加载方式Java的内存模型?JVM内存模型-jdk8程序计数器&#xff1a;Java虚拟机栈局部变量表和操作数栈&#xff1a; Java内存模型中堆和栈的区别…

vector 用法

C++数组是继承C语言的,C++标准库中的vector封装了动态数组,是一个模板类(vector<int>,<>里面可以是各种类型。 定义方式: vector<元素类型> 对象名(长度); (注:vector还有个好处就是,数组定义时长度那里不能包含变量,但是vector定义时长度那里可…

家政小程序有哪些功能 怎么制作

随着人们生活节奏的加快&#xff0c;家政服务变得越来越受到人们的青睐。为了提升家政服务的便捷性和高效性&#xff0c;家政小程序成为了越来越受欢迎的选择。下面具体介绍家政小程序有哪些功能&#xff0c;如何制作。 1. 展示家政服务 在小程序中&#xff0c;上传所有的家政…

C语言中的字体背景颜色汇总

客官请看效果 客官请看代码 #include <stdio.h> #include <stdlib.h> #include <windows.h>int main() {int i;for (i 0; i < 254; i) {SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), i); // 设置当前文本颜色为循环变量对应的颜色printf(…

Git+py+ipynb Usage

0.default config ssh-keygen -t rsa #之后一路回车,当前目录.ssh/下产生公私钥 cat ~/.ssh/id_rsa.pub #复制公钥到账号 git config --global user.email account_email git config --global user.name account_namebug of ipynb TqdmWarning: IProgress not found. Please …

移动端自动化常用的元素定位工具 介绍

在移动端自动化测试和开发中&#xff0c;元素定位是非常关键的一步。以下是一些常用的工具和技术来帮助开发者或测试工程师在移动设备上定位元素&#xff1a; 1. **UiAutomator**: - **UiAutomator** 是 Android 官方提供的自动化测试框架。它可以用来编写测试脚本&…

【电子通识】为什么单片机芯片上会有多组VDD电源?

在单片机芯片规格书中&#xff0c;我们经常能看到多个组VDD的设计&#xff0c;如下红框所示管脚都是VDD管脚。 为什么需要这样设计&#xff1f;只设置一个VDD管脚&#xff0c;把其他的VDD管脚让出来多做几个IO或是其他复用功能不好吗&#xff1f;接下来我们从单片机内部的电路结…

微信小程序商城-兜点零食

微信小程序商城 【微信小程序商城-兜点零食】 小程序采用uniappvue开发&#xff0c;后台djangopython开发&#xff0c;模块化方便二次开发 1、具备商城完整功能&#xff0c;包括在线下单、支付、订单跟踪、物流查询&#xff1b; 2、具备社交化分享功能&#xff0c;为用户提供分…

【Java程序设计】【C00290】基于Springboot的网上书城管理系统(有论文)

基于Springboot的网上书城管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的网上书城管理系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xff1a;在系统首页可以查看首…

【数据结构】时间复杂度(加法乘法规则、渐近时间复杂度、循环时间复杂度总结

2.2 时间复杂度 什么是时间复杂度&#xff1f; 评估算法时间开销 T ( n ) O ( f ( n ) ) T(n)O(f(n)) T(n)O(f(n)) 在实际求解中&#xff0c;只留表达式中最高阶的部分&#xff0c;丢弃其他部分。 如何求解&#xff1f; 求解步骤 1.找到一个最深层的基本操作&#xff1b; 2.分…

yolov8添加注意力机制模块-CBAM

修改 在tasks.py&#xff08;路径&#xff1a;ultralytics-main/ultralytics-main - attention/ultralytics/nn/tasks.py&#xff09;文件中&#xff0c;引入CBAM模块。因为yolov8源码中已经包含CBAM模块&#xff0c;在conv.py文件中&#xff08;路径&#xff1a;ultralytics-…

【README 小技巧】在项目README.md 中展示github点赞数量

在项目README.md 中展示github点赞数量 [![Star History Chart](https://api.star-history.com/svg?reposwujiawei1207537021/wu-lazy-cloud-network&typeDate)](https://star-history.com/#wujiawei1207537021/wu-lazy-cloud-network&Date)效果

【微服务】mybatis typehandler使用详解

目录 一、前言 二、TypeHandler简介 2.1 什么是TypeHandler 2.1.1 TypeHandler特点 2.2 TypeHandler原理 2.3 mybatis自带的TypeHandler 三、环境准备 3.1 准备一张数据表 3.2 搭建一个springboot工程 3.2.1 基础依赖如下 3.2.2 核心配置文件 3.2.3 测试接口 四、T…

java面向对象高级

一、静态 static读作静态&#xff0c;可以用来修饰成员变量&#xff0c;也能修饰成员方法。我们先来学习static修饰成员变量。 1.1 static修饰成员变量 Java中的成员变量按照有无static修饰分为两种&#xff1a;类变量、实例变量。它们的区别如下图所示&#xff1a; 由于静态…

通过底层原理理解Java是值传递还是引用传递?

本文学习目标或者巩固的知识点 参数传递方式 值传递引用传递指针传递 彻底理解Java的值传递和引用传递 从底层的角度分析值传递会发生复制行为 Java的参数传递例子 快手的一面面试曾经问到过此类题目&#xff0c;所以记下此篇加深印象。 问&#xff1a;求下面main方法中的输…