当前位置: 首页 > news >正文

leetCode刷题 5.最长回文子串

目录

1. 思路

2. 解题方法

3. 复杂度

4. Code


题目:

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

1. 思路

        要找到字符串 s 中的最长回文子串,我们可以尝试不同的方法。一种常见的方法是使用动态规划。我们定义一个二维数组 dp,其中 dp[i][j] 表示从索引 i 到索引 j 的子串是否是回文串。根据动态规划的思想,我们可以从长度较短的子串开始,逐步扩展到长度较长的子串,并记录下最长的回文子串。

2. 解题方法

  1. 定义一个二维数组 dp,其中 dp[i][j] 表示从索引 i 到索引 j 的子串是否是回文串。
  2. 初始化 dp 数组,所有长度为 1 的子串都是回文串,相邻字符相同的子串也是回文串。
  3. 遍历字符串,根据动态规划的定义填充 dp 数组。
  4. 在计算 dp 数组的过程中,记录下最长的回文子串的起始位置和长度。
  5. 返回最长的回文子串。

3. 复杂度

  • 时间复杂度:O(n^2),其中 n 是字符串的长度。动态规划需要填充一个二维数组,每个位置需要 O(1) 的时间复杂度。
  • 空间复杂度:O(n^2),需要一个二维数组来存储动态规划的结果。

4. Code

class Solution {public String longestPalindrome(String s) {if (s == null || s.length() < 1) return "";int n = s.length();// 定义二维数组 dp,dp[i][j] 表示从索引 i 到索引 j 的子串是否是回文串boolean[][] dp = new boolean[n][n];int start = 0, maxLength = 1;// 初始化 dp 数组,所有长度为 1 的子串都是回文串for (int i = 0; i < n; i++) {dp[i][i] = true;}// 遍历字符串,计算 dp 数组for (int len = 2; len <= n; len++) {for (int i = 0; i <= n - len; i++) {int j = i + len - 1;// 如果当前子串的头尾字符相同,并且内部子串也是回文串,则当前子串是回文串if (s.charAt(i) == s.charAt(j) && (len == 2 || dp[i + 1][j - 1])) {dp[i][j] = true;// 更新最长回文子串的起始位置和长度if (len > maxLength) {start = i;maxLength = len;}}}}// 返回最长回文子串return s.substring(start, start + maxLength);}
}

        这段代码使用动态规划的方法,实现了找到字符串中最长的回文子串。通过填充一个二维数组 dp,记录从每个位置开始到每个位置结束的子串是否是回文串,并根据动态规划的结果找到最长的回文子串。

欢迎大家后台联系讨论。

http://www.lryc.cn/news/312766.html

相关文章:

  • 计算机组成原理面试题
  • 「Mybatis深入三」:高级查询-模糊查询
  • LabVIEW管道缺陷智能检测系统
  • java在cmd中乱码的问题解决
  • OpenHarmony教程指南—ArkUI中组件、通用、动画、全局方法的集合
  • 第二证券|金价逼近历史高点 黄金股价值有望重估
  • 关于51单片机晶振定时问题
  • NoSQL--2.MongoDB配置(Windows版)
  • HTML静态网页成品作业(HTML+CSS)——安徽宣笔设计制作(5个页面)
  • MySQL CTEs通用表表达式:进阶学习-递归查询
  • [Java安全入门]二.序列化与反序列化
  • Dutree:Linux 文件系统磁盘使用追踪工具
  • http和https的区别是什么?
  • 学习Android的第十九天
  • C#上位机调试经验
  • BUUCTF---[极客大挑战 2019]BabySQL1
  • 0基础跨考计算机|408保姆级全年计划
  • C# 操作LiteDB
  • LeetCode 2917.找出数组中的 K-or 值:基础位运算
  • MySQL窗口函数:从理论到实践
  • Vue+SpringBoot打造考研专业课程管理系统
  • python基础第二天
  • YOLOV9论文解读
  • 【Spring】21 通过@Primary注解优化注解驱动的自动装配
  • 【HTML】HTML基础7.3(自定义列表)
  • java设计模式课后作业(待批改)
  • qt 语音引擎 QTextToSpeech Microsoft SAPI
  • react hook: useimperativeHandle
  • 30天自制操作系统(第28天)
  • Nginx启动服务