(动态规划) 5. 最长回文子串 ——【Leetcode每日一题】

news/2024/11/29 9:42:42/

❓ 5. 最长回文子串

难度:中等

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

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

示例 1:

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

示例 2:

输入:s = “cbbd”
输出:“bb”

提示

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

💡思路:

法一:中心点扩展法

首先确定回文串,就是找中心然后想两边扩散看是不是对称的就可以了。

  • 一个元素可以作为中心点;
  • 两个元素也可以作为中心点。

法二:动态规划

定义 dp 数组,dp[i][j] 表示区间范围 [i,j] (注意是左闭右闭)的子串是否是回文子串,如果是 dp[i][j]true,否则为 false

要从下到上,从左到右遍历,当 s[i]s[j] 相等时,有如下三种情况:

  1. 下标 ij 相同,同一个字符例如 a,当然是回文子串
  2. 下标 ij 相差为1,例如 aa,也是文子串
  3. 下标:ij 相差大于1的时候,例如 cabac,此时 s[i]s[j] 已经相同了,我们看 ij 区间是不是回文子串就看 aba 是不是回文就可以了,那么 aba 的区间就是 i+1j-1区间,这个区间是不是回文就看 dp[i + 1][j - 1] 是否为 true

🍁代码:(C++、Java)

法一:中心点扩展法
C++

class Solution {
private:int strLen (string s, int l, int r){while(l >= 0 && r < s.size()){if(s[l] == s[r]){l--; r++;}else break;}return r - l - 1;}
public:string longestPalindrome(string s) {int mid = 0, len = 0;int n = s.size();for(int i = 0; i < n; i++){int tmp = strLen(s, i - 1, i + 1);if(i < n - 1 && s[i] == s[i + 1]) {tmp = max(tmp, strLen(s, i - 1, i + 2));} if(tmp > len){mid = i;len = tmp;}}//记录开始点int start = mid - len / 2;if(len % 2 == 0) start += 1;return s.substr(start, len);}
};

Java

class Solution {private int strLen (String s, int l, int r){while(l >= 0 && r < s.length()){if(s.charAt(l) == s.charAt(r)){l--; r++;}else break;}return r - l - 1;}public String longestPalindrome(String s) {int mid = 0, len = 0;int n = s.length();for(int i = 0; i < n; i++){int tmp = strLen(s, i - 1, i + 1);if(i < n - 1 && s.charAt(i) == s.charAt(i + 1)) {tmp = Math.max(tmp, strLen(s, i - 1, i + 2));} if(tmp > len){mid = i;len = tmp;}}//记录开始点int start = mid -len / 2;if(len % 2 == 0) start += 1;return s.substring(start, start + len);}
}

法二:动态规划
C++

class Solution {
public:string longestPalindrome(string s) {vector<vector<int>> dp(s.size(), vector<int>(s.size(), 0));int start = 0;int len = 0;for(int i = s.size() - 1; i >= 0; i--){for(int j = i; j < s.size(); j++){if(s[i] == s[j]){if(j - i <= 1 ||dp[i + 1][j - 1]) dp[i][j] = 1;}if(dp[i][j] && j - i + 1 > len){len = j - i + 1;start = i;}}}return s.substr(start, len);}
};

Java

class Solution {public String longestPalindrome(String s) {boolean[][] dp = new boolean[s.length()][s.length()];int start = 0;int len = 0;for(int i = s.length() - 1; i >= 0; i--){for(int j = i; j < s.length(); j++){if(s.charAt(i) == s.charAt(j)){if(j - i <= 1 ||dp[i + 1][j - 1]) dp[i][j] = true;}if(dp[i][j] && j - i + 1 > len){len = j - i + 1;start = i;}}}return s.substring(start, start + len);}
}

🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:

  • 时间复杂度 O ( n 2 ) O(n^2) O(n2),其中 n 为字符串的长度。
  • 空间复杂度 O ( 1 ) O(1) O(1),法一为 O ( 1 ) O(1) O(1); 法二存储动态规划状态需要 O ( n 2 ) O(n^2) O(n2)空间。

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!

注: 如有不足,欢迎指正!


http://www.ppmy.cn/news/569361.html

相关文章

Android 中Looper机制详解

版本基于&#xff1a;Android R 0. 前言 在《Android 基于Handler 剖析消息机制》一文中&#xff0c;以 Handler 类为起点详细分析了异步通信&#xff0c;分析了Java 端 Handler 与Looper、MessageQueue、Message 之前的通信关系。 框架如下&#xff1a; 在Java 端的 Looper …

可视化的工时管理:让项目进度真实可见

在现代项目管理中&#xff0c;工时表软件作为一种强大而有效的工具&#xff0c;能够帮助团队更好地管理项目进度。无论是大小型项目&#xff0c;正确使用工时表软件都可以提高团队的效率和项目的可追踪性。本文将介绍一些关键步骤&#xff0c;以帮助企业利用工时表软件来管理项…

office 2021下载地址

http://officecdn.microsoft.com/pr/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-cn/HomeStudent2021Retail.img

Adobe Audition CC 2019 下载安装教程

一、下载 链接: https://pan.baidu.com/s/1JVw2HjgsF240-1bxLJNISA 提取码: fr33 下载好后解压 解压后的文件如下 二、安装 1.以管理员身份运行Set-up.exe 更改安装位置 创建一个名为“AU2019”文件夹&#xff0c;然后点击确定 点击继续 等待安装完成后&#xff0c;点击关闭…

Office Professional Plus 2019 下载安装激活

Office Professional Plus 2019 简体中文版 官方原版 文件名cn_office_professional_plus_2019_x86_x64_dvd_5e5be643.isoSHA1d850365b23e1e1294112a51105a2892b2bd88eb9文件大小3.52GB发布时间2018-10-03序列号不提供&#xff0c;自己解决 下载地址 ed2k://|file|cn_office…

office 2019中文

虽然现在Office已经更新到2021版本&#xff0c;但是经典的2019 office依然受到追捧&#xff0c;office 2019通过添加更多功能并将新工具添加到表中来改进office 2016的高级功能&#xff0c;由于office 2016是早期版本&#xff0c;因此可以将一些主要差异精确定位为Microsoft对o…

Adobe Audition CC 2020中文版

安装教程 1、在我们下载之家下载Adobe Audition cc 2020并解压缩&#xff0c;双击里面的 Set-up.exe进行安装 2、可以更改安装路径 3、然后等待安装&#xff1a; 4、提示安装完毕 5、在开始菜单&#xff0c;打开Adobe Audition 2020的文件位置。 6、选择Adobe Audition 2020&a…

Office Professional Plus 2016简体中文版

Office Professional Plus 2016简体中文版 官方MSDN 版本号16.0.4266.1003 64位、32位都在这一个镜像里&#xff0c;默认安装为32位版本&#xff0c;想安装64位的请点开office文件夹运行setup64.exe office2016最好用的就是添加了功能搜索&#xff0c;再也不用为找不到…