代码随想录——最长回文子串

news2025/4/18 12:22:39

题目

给你一个字符串 s,找到 s 中最长的回文子串。

示例 1:

输入:s = “babad” 输出:“bab” 解释:“aba” 同样是符合题意的答案。 示例 2:

输入:s = “cbbd” 输出:“bb” 示例 3:

输入:s = “a” 输出:“a” 示例 4:

输入:s = “ac” 输出:“a”

思路

回文子串,立即推->

①动态规划(两端收缩法,相同则i++,j–继续比较)
②双指针法(两种中心扩散法)

其中动态规划空间复杂度比较高

方法一:动态规划

动规五部曲:

  1. 确定dp数组和下标含义
    布尔类型的dp[i][j]:表示区间[i,j]的子串是否是回文子串,如果是的话则dp[i][j] 为 true

  2. 确定递推公式
    分为来两种情况:
    (1)s[i] != s[j],不相等的话dp[i][j]一定为false
    (2)s[i] == s[j],这里有三个情况
    情况一:下标ij相同,即i == j,同一个字符例如a,当然是回文子串
    情况二:下标ij相差为1或者为2时,即j- i == 1,或者j- i == 2,例如aa,axa也是回文子串
    情况三:下标 ij相差大于1的时候,即,j - i > 1,例如cabac,此时s[i]s[j]已经相同了,看[i,j]区间是不是回文子串就看aba是不是回文就可以了,那么aba的区间就是 [i+1 , j-1]区间,这个区间是不是回文就看dp[i + 1][j - 1]是否为true

  3. 初始化dp
    dp[i][j]初始化为false

  4. 确定遍历顺序
    在这里插入图片描述
    所以一定要从下到上,从左到右遍历,这样保证dp[i + 1][j - 1]都是经过计算的,有的代码实现是优先遍历列,然后遍历行,其实也是一个道理,都是为了保证dp[i + 1][j - 1]都是经过计算的。

  5. 举例推导dp数组
    举例,输入:“aaa”,dp[i][j]状态如下:
    在这里插入图片描述
    java代码如下:

class Solution {
	public String longestPalindrome(String s){
		if(s.length() == 0 || s.length() == 1) return s;
		int n = s.length();
		int maxLen = 1;//记录最长子串长度
		int begin = 0;//每一个开始判断的回文子串的起始位置
		// dp[i][j] 表示 [i,j]范围的子串是否是回文串
		boolean[][] dp = new boolean[n][n];
		//初始化:所有长度为 1 的子串,即区间[i,i]的子串都是回文串
		for(int i = 0; i < n; i++){
			dp[i][i] = true;
		}
		
		char[] chars = s.toCharArray();
		//先枚举子串的长度,长度为1的子串已经考虑过了,从长度2开始,一直到整个字符串
		for(int L = 2; L <= n; L++){
			//枚举左边界
			for(int i = 0; i < n; i++){
				//由L和i可以确定右边界,即 L = j - i + 1 => j = L + i - 1
				int j = L + i - 1;
				//如果右边界越界,则终止循环
				if(j >= n) break;
				
				if(chars[i] != chars[j]){
					dp[i][j] = false;
				} else {
					if(j - i <= 2){
						dp[i][j] = false;
					} else {
						dp[i][j] = dp[i+1][j-1];
					}
				}
				 // 只要 dp[i][L] == true 成立,就表示子串 s[i..L] 是回文,此时记录回文长度和起始位置
				 if(dp[i][j] && j - i + 1 > maxLen){
				 	maxLen = j - i + 1;
				 	begin = i; 
				 }
			}
		}
		return s.subString(begin,begin + maxLen);
	}
}

方法二:双指针法/中心扩散法

确定回文串,就是找中心然后向两边扩散看是不是对称的就可以了,确定有多少个回文字串,中心扩散法,可以理解为,遍历每个中心点,判断每个中心点左右是不是回文串,是的话左–右++再继续判断

只不过在遍历中心的时候,中心点会有两种情况:
一个元素可以作为中心点,两个元素也可以作为中心点,给定一个字符串s,长度为len,则中心点的个数为2 * len - 1,分别是len个单字符和len-1个双字符,如 “abcde”,那么可能的中心点为“a”、“b”、“c”、“d”、“e”、“ab”、“bc”、“cd”、“de”一共2 * 5-1=9个

所以要分两种情况讨论:一个中心点和两个中心点

java代码如下:

class Solution {
	public String longestPalindrome(String s){
		String s1 = "";//一个中心点开始扩散的结果
		String s2 = "";//两个中心点开始扩散的结果
		String res = "";//记录以一个为中心点和以两个为中心点扩散结果的最长子串
		for(int i = 0; i < s.length(); i++){
			// 分两种情况:即一个元素作为中心点,两个元素作为中心点
			s1 = extend(s,i,i);//情况一
			res = s1.length() > res.length() ? s1 : res;//记录最长的回文子串
			s2 = extend(s,i,i+1);//情况二
			res = s2.length() > res.length() ? s2 : res;
		}
		return res;//返回最长的
	}
	public String extend(String s, int start, int end){
		String tmp = "";
		while(start > 0 && end < s.length() && s.chatAt(start) == s.charAt(end)){
			tmp = s.subString(start,end + 1); //Java中substring是左闭右开的,所以要+1
			//向两边扩散
			start++;
			end--;
		}
		return tmp;
	}
}

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

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

相关文章

六、RTMP协议 时间戳

RTMP时间戳 基本介绍 RTMP中时间戳的单位为毫秒(ms)时间戳为相对于某个时间点的相对值时间戳的长度为32bit&#xff0c;不考虑回滚的话&#xff0c;最大可表示49天17小时2分钟47.296秒Timestamp delta单位也是毫秒&#xff0c;为相对于前一个时间戳的一个无符号整数&#xff1…

【计算机毕业设计】奖学金管理系统源码

一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐…

【数据结构】---详解二叉树--- ⌈知识点总结⌋ 和 ⌈常见力扣题目⌋ 确定不来看吗?

前言 ❤️ 铁汁们大家好&#xff0c;欢迎大家来到出小月的博客里&#xff0c; &#x1f917;&#x1f917;&#x1f917;之前呢&#xff0c;我分享了数据结构的栈和队列。。。。今天呢&#xff0c;给大家分享关于树的内容包括了树的结构、遍历和一些题目&#xff0c;希望大家看…

如何使用Github的Action实现博客的自动部署

如何使用Github的Action实现博客的自动部署 以下是详细的采坑记录&#xff0c;花费了不少时间。 现在的状态是&#xff0c;更新完博客时&#xff0c;需要执行以下的指令&#xff1a; hexo clean && hexo g && hexo d && git add . && git …

Git分布式版本控制工具

layout: post title: Git分布式版本控制工具 description: Git分布式版本控制工具 tag: 开发工具 文章目录git 基本配置与指令设置用户信息为常用指令设置别名解决gitbash乱码问题基础操作指令&#xff1a;初始化、添加到暂存区、提交到仓库、查看状态、日志版本回退git reset配…

智工教育:一级建造师《公路实务》考前必背知识点

一、路基工程 1.地基表层碾压处理压实度控制标准为&#xff1a;二级及二级以上公路一般土质应不小于90%&#xff1b;三、四级公路应不小于85%。 2.石质路堑施工技术 &#xff08;1&#xff09;应逐级开挖&#xff0c;逐级按设计要求进行防护。 &#xff08;2&#xff09;施工…

高效工具-局域网服务器访问公网

文章目录任务需求方法1&#xff1a;使用CCproxy代理简单介绍下载安装配置逻辑本机配置客户机配置成功测试方法2:修改MAC地址查询本机MAC地址修改内网服务器MAC地址打开rc-local.service服务添加Install段创建rc.local文件添加核心的修改MAC地址代码创建链接启动服务成功测试参考…

线上超市小程序开发有什么作用_超市小程序有什么功能呢

1。开发超市小程序有什么价值&#xff1f; 1、对于消费者来说&#xff1a;通过超市小程序能够更加直接的购买到想要的产品&#xff0c;消费者无需再到门店寻找商品可以直接通过超市小程序进行在线浏览&#xff1b;通过在线搜索的方式能够更加便捷的搜索到相应的商品&#xff0…

mysql连接池的实现

文章目录前言一、池化技术二、什么是数据库连接池三、为什么使用数据库连接池不使用连接池使用连接池长连接和连接池的区别四、数据库连接池运行机制五、连接池和线程池的关系六、连接池设计要点连接池设计逻辑构造函数初始化请求获取连接归还连接析构连接池前言 本文是mysql连…

模数转换电路

一、Exynos4412 A/D转换器概述 1. 概述 ADC(Analog-to-Digital Converter)&#xff0c;就是模数转换器。从字面上看&#xff0c;A我们称为模拟信号(Analog signal)&#xff0c;D我们称为数字信号(digital signal)。 模数转换器&#xff0c;在电子技术中即是将模拟信号转换成数字…

[附源码]java毕业设计家乡旅游文化推广系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

教你STM32做USB鼠标、键盘

使用CubeMX软件傻瓜式的配置&#xff0c;一键生成USB的HID驱动。 一、USB鼠标 1、CubeMX配置 ①、选择相对应的芯片 ②、配置时钟和Debug和debug ③、配置USB ④、生成代码 最好把这个也勾上&#xff0c;勾上以后每个外设配置不再都给你塞到main.c里&#xff0c;而是建一个.c…

简单的爬虫架构和网页下载器requests

目录 简单的爬虫架构&#xff1a; 网页下载器&#xff1a; URL管理器: 网页解析器: 网页下载器requests: 发送requests请求&#xff1a; 接收requests请求: requests操作实例&#xff1a; 简单的爬虫架构&#xff1a; 网页下载器&#xff1a; 负责通过URL将网页进行下载…

聊聊Vuex原理

背景 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。Vuex 是专门为 Vue.js 设计的状态管理库&#xff0c;以利用 Vue.js 的细粒度数据响应机制来进行高效的状态更新。如果你已经灵活运用&#xff0c;但是依然好奇它底层实现逻辑&#xff0c;不妨一探究竟。 Vue 组件开发…

docker系统笔记-03镜像的创建管理和发布

镜像的获取 pull from registry (online) 从registry拉取 public&#xff08;公有&#xff09;private&#xff08;私有&#xff09; build from Dockerfile (online) 从Dockerfile构建load from file (offline) 文件导入 &#xff08;离线&#xff09; 镜像的基本操作 dock…

概率 | 【提神醒脑】自用笔记串联二 —— 数字特征、大数定律、统计量

本文总结参考于 kira 2023概率提神醒脑技巧班。 笔记均为自用整理。加油&#xff01;ヾ(◍∇◍)&#xff89;&#xff9e; 第一部分笔记详见 概率 | 【提神醒脑】自用笔记串联一 —— 事件、随机变量及其分布_西皮呦的博客-CSDN博客 一研为定&#xff01; 四、随机变量的数字特…

cocos2dx 3D物理相关知识点汇总

&#xff08;一&#xff09;3D相关基础知识 网格&#xff08;Mesh&#xff09; 通常说的网格其实就是3D建模出来的形状。因为模型是由很多三角形组成&#xff0c;所以&#xff0c;就像网格一样。 纹理 纹理的作用就是给网格上色。 怎么上色的&#xff1f; 举个简单的例子。…

m基于GA遗传优化的生产工艺设备布置优化matlab仿真

目录 1.算法概述 2.仿真效果预览 3.核心MATLAB程序 4.完整MATLAB程序 1.算法概述 在设备布置的问题上&#xff0c;本文将作业车间设备布置这个多目标优化问题看成是包含布局面积&#xff0c;物流成本和生产工艺的连续优化的多行设备布置问题&#xff0c;使之更具有实际意义…

如何在 Rocky Linux 上安装 Apache Kafka?

Apache Kafka 是一种分布式数据存储&#xff0c;用于实时处理流数据&#xff0c;它由 Apache Software Foundation 开发&#xff0c;使用 Java 和 Scala 编写&#xff0c;Apache Kafka 用于构建实时流式数据管道和适应数据流的应用程序&#xff0c;特别适用于企业级应用程序和关…

robots.txt漏洞

robots.txt漏洞描述: 搜索引擎可以通过robots文件可以获知哪些页面可以爬取,哪些页面不可以爬取。Robots协议是网站国际互联网界通行的道德规范,其目的是保护网站数据和敏感信息、确保用户个人信息和隐私不被侵犯,如果robots.txt文件编辑的太过详细,反而会泄露网站的敏感…