(Java)心得:LeetCode——5.最长回文子串

一、原题

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

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

二、心得

        @官方,你管这叫中等难度题?(・∀・(・∀・(・∀・*)·····

        我承认在上一篇我猖狂了,对不起(鞠躬90°)。简单一下说一说我的思路(思路不全,勿借鉴):首先把字符串 s 进行 toCharArray() 方法,得到数组 c,执行如下代码:

for(int i = 1; i < s.length(); ++ i){for(int j = 1; j <= Math.min(i, s.length() - i - 1); j ++){if(c[i - j] == c[i + j]){return s.substring(i - j, i + j + 1);}}
}

        我主要考虑的是以下情况(即,至少为 BAB 回文子串):

        后来,我即使考虑了 s.length() 分别为1和2的情况等多种情况,但奈何测试时好多案例我都通不过,比如 s = "cccc“,s = "cccced"等,后来我发现需要考虑的情况太多,只好借鉴一下官方了(拿起我的小本本,乖乖坐好,(●'◡'●))。

        官解如下(动态规划):

public class Solution {public String longestPalindrome(String s) {int len = s.length();if (len < 2) {return s;}int maxLen = 1;int begin = 0;// dp[i][j] 表示 s[i..j] 是否是回文串boolean[][] dp = new boolean[len][len];// 初始化:所有长度为 1 的子串都是回文串for (int i = 0; i < len; i++) {dp[i][i] = true;}char[] charArray = s.toCharArray();// 递推开始// 先枚举子串长度for (int L = 2; L <= len; L++) {// 枚举左边界,左边界的上限设置可以宽松一些for (int i = 0; i < len; i++) {// 由 L 和 i 可以确定右边界,即 j - i + 1 = L 得int j = L + i - 1;// 如果右边界越界,就可以退出当前循环if (j >= len) {break;}if (charArray[i] != charArray[j]) {dp[i][j] = false;} else {if (j - i < 3) {dp[i][j] = true;} 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 的长度大于2):

P(i, j) = P(i + 1, j − 1) ∧ (Si ​== Sj​)P(i, j) 表示字符串 s 的第 i 到 j 个字母组成的串 

        只要 P(i + 1, j −1) 和 Si ​== Sj​ 都满足,则 P(i, j) 一定为回文子串。这样解决了我只能考虑长度为奇数的回味子串的问题,即奇偶长度的回文都考虑了。

        后只需确定动态规划的边界条件:

P(i, i + 1) = (Si ​== S(i+1)​)

        只要存在相邻的相同的字母,那么它们一定是回文。

        对于为什么要用 boolean[][] dp = new boolean[len][len];,如表所示:

以s="babad"为例,假设取最大回文为"bab"
dp[][0]dp[][1]dp[][2]dp[][3]dp[][4]
dp[0][](b,b)(b,a)(b,b)(b,a)(b,d)
dp[1][](a,b)(a,a)(a,b)(a,a)(a,d)
dp[2][](b,b)(b,a)(b,b)(b,a)(a,d)
dp[3][](a,b)(a,a)(a,b)(a,a)(b,b)
dp[4][](d,b)(d,a)(d,b)(d,a)(d,d)

        可以发现只需要对角线能形成回文,即绿色区域。然后再处理一下越界情况,并记录回文起始点和回文长度即可得出正确解。

        悄悄地说,我并不怎么会处理二维数组的相关算法,但,加油,I can (ง •_•)ง~

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

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

相关文章

神经网络的偏见

神经网络的偏见 前言 神经网络是人工智能和深度学习的核心技术之一&#xff0c;当前的各种大模型和人工智能程序都使用了神经网络技术。 对人类来说&#xff0c;神经网络能根据人类输入的大量数据&#xff0c;实现人类训练模型的目的。但是&#xff0c;神经网络对人类来说是…

【Linux】什么是进程?

一个正在执行的程序&#xff0c;我们称之为进程。 然后我们来顺着一条线来思考。 操作系统底层是用C语言编写的&#xff0c;而我们的进程&#xff0c;它会有各种属性&#xff0c;那么各种属性就可以用一个结构体来对进程的各个属性进行描述&#xff0c;然后这个结构体里面&…

手写一个SPI FLASH 读写擦除控制器(未完)

文章目录 flash读写数据的特点1. 扇擦除SE&#xff08;Sector Erase&#xff09;1.1 flash_se 模块设计1.1.1 信号连接示意图&#xff1a;1.1.2 SE状态机1.1.3 波形图设计&#xff1a;1.1.4 代码 2. 页写PP(Page Program)2.1 flash_pp模块设计2.1.1 信号连接示意图&#xff1a;…

Soviet Kitchen

苏联厨房-具有道具和带有碰撞器的模块化建筑部件的游戏环境资产 内部资产包: 网格-253 前言-98 材料-26 纹理-116 网格格式-(FBX) 纹理格式-(PNG) 资产列表: _BigShelf 多边形计数-1986 文本大小-2048x2048 可以 多边形计数-277 结构尺寸-512x512 _Celling 多边形计数-1 …

Codeforces Round 217 (Div. 2) A. Rook, Bishop and King(BFS)

Rook, Bishop and King 题面翻译 【题目描述】 佩蒂亚正在学习国际象棋。他已经学会如何移动王、车和象。让我们提示你如何移动国象棋子。棋盘有 64 64 64个棋格&#xff0c;呈 8 8 8\times8 88正方形。一个格子可以用 ( r , c ) (r,c) (r,c)来表示—— r r r指行&#xff…

Stable Diffusion的技术原理

一、Stable Diffusion的技术原理 Stable Diffusion是一种基于Latent Diffusion Models&#xff08;LDMs&#xff09;实现的文本到图像&#xff08;text-to-image&#xff09;生成模型。其工作原理主要基于扩散过程&#xff0c;通过模拟数据的随机演化行为&#xff0c;实现数据…

回表的原理竟然这么简单

“回表” 是指在使用辅助索引&#xff08;非聚簇索引&#xff09;作为条件进行查询时&#xff0c;由于辅助索引中只存储了索引字段的值和对应的主键&#xff08;聚簇索引&#xff09;键值&#xff0c;因此需要根据主键&#xff08;聚簇索引&#xff09;中的键值去查找实际的数据…

verilog中含有无关项的序列检测

编写一个序列检测模块&#xff0c;检测输入信号a是否满足011XXX110序列&#xff08;长度为9位数据&#xff0c;前三位是011&#xff0c;后三位是110&#xff0c;中间三位不做要求&#xff09;&#xff0c;当信号满足该序列&#xff0c;给出指示信号match。 程序的接口信号图如…

vue+onlyOffice+java : 集成在线编辑word并保存

1.docker部署onlyOffice 1.1拉取最新版onlyOffice镜像 sudo docker pull onlyoffice/documentserver 1.2运行以下命令运行容器 其中 -v 后的第一部分是挂载自己的linux的哪个目录 # 启动docker容器&#xff0c;默认启动端口为80&#xff0c;可以进行修改 docker run -i -t …

[补题记录] StarryCoding 入门教育赛3 D.电弧陷阱

URL&#xff1a;小白教育赛3 题目描述 劳 e e e和桶子在打派的时候被一个艾许的电弧陷阱控在原地动弹不得&#xff0c;于是他们想办法找出哪些地方是可以去的&#xff0c;哪些地方是不能去的。 给定一个由字符构成的 N ∗ M N * M N∗M的矩阵&#xff0c;其中包括&#xff1…

Python 中的 Lambda 函数:简单、快速、高效

大家好&#xff0c;今天再给大家介绍一个python的一个强大工具Lambda 函数&#xff0c;它允许你快速定义简单的匿名函数。这种函数是“匿名的”&#xff0c;因为它们不需要像常规函数那样被明确命名。 在本文中&#xff0c;我们将通过清晰的解释和实用的示例&#xff0c;深入了…

基于GIS地理技术+智慧巡检解决方案(Word原件)

传统的巡检采取人工记录的方式&#xff0c;该工作模式在生产中存在很大弊端&#xff0c;可能造成巡检不到位、操作失误、观察不仔细、历史问题难以追溯等现象&#xff0c;使得巡检数据不准确&#xff0c;设备故障隐患得不到及时发现和处理。因此建立一套完善的巡检管理系统是企…

Redis 数据操作与故障排除指南

Redis 是一个高性能的键值数据库&#xff0c;广泛用于缓存、会话管理等多种场景。当你在使用 Redis 时遇到 nil 值或其他问题&#xff0c;可能是因为你没有正确地定位到数据所在的数据库或节点。本文将帮助你理解如何在 Redis Cluster 或多数据库环境中正确操作和解决常见问题。…

【2022 深圳 ArchSummit 】大数据架构稳定性保障实践

文章目录 一、前言二、现状三、大数据架构的历史变迁&#xff08;一&#xff09;洪荒期&MR&#xff08;二&#xff09;远古期&MPP&#xff08;四&#xff09;近现代&Flink/Spark&#xff08;五&#xff09;现如今&实时数据湖架构 四、架构稳定的关键因素&#…

编程式导航

目录 一、问题引入 二、基本跳转 1.path路径跳转&#xff08;简易方便&#xff09; 2.name命名路由跳转&#xff08;适合path路径长的场景&#xff09; 三、路由传参 1.path路径跳转传参 &#xff08;1&#xff09;query传参 &#xff08;2&#xff09;动态路由传参 2.…

C语言UDP网络编程

目录 1. C语言UDP编程简介 1.1 背景与意义 1.2 UDP协议简介 1.3 C语言在网络编程中的应用 2. UDP网络编程基础 2.1 套接字编程概念 2.2 UDP套接字创建与绑定 2.3 数据发送与接收 2.4 关闭套接字 3. C语言UDP编程实例 3.1 简单聊天室 3.2 文件传输程序 3.3 广播消息…

后端返回文件流格式,前端vue 导出下载表格

//日期时间格式化 export const formatDate (edate, type) > { var date new Date(edate); var year date.getFullYear(); //年 var month date.getMonth() 1 < 10 ? "0" (date.getMonth() 1) : date.getMonth() 1; //月 var day date.getDate() &l…

家装新宠!装修APP开发解决方案,为业主提供全新装修模式

随着人们对家庭装修的需求度越来越高&#xff0c;装修APP开发也随之出现。如今装修APP开发可实现互联网与传统家装行业的信息结合&#xff0c;由传统的家装行业广告模式向移动端的互联网模式进行转移&#xff0c;实现传统家装行业与互联网的相辅相成&#xff0c;以此来推动家装…

电商核心技术揭秘54: 粉丝经济的挖掘与利用

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘相关系列文章合集&#xff08;3&#xff09; 电商技术揭秘四十一&#xff1a;电商平台的营销系统浅析 电商技术揭秘四十二&#…

2024年华为OD机试真题-螺旋数字矩阵-C++-OD统一考试(C卷D卷)

题目描述: 疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法: 给出数字个数n和行数m(0 < n ≤ 999,0 < m ≤ 999),从左上角的1开始,按照顺时针螺旋向内写方式,依次写出2,3...n,最终形成一个m行矩阵。 小明对这个矩阵有些要求: 1.每行数字的…