LeetCode 5. 最长回文子串 Longest Palindromic Substring

题目:

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba"也是一个有效答案。

示例 2:

输入: "cbbd"
输出: "bb"


 解法一

遍历字符串,以每个字母为中心,向两边扩散查找,记录当前最长的回文子串的长度和起始位置、结尾位置。时间复杂度O(n^2)

注意:

①当剩下的字符串长度小于当前maxlen的一半时,说明遍历剩下的字符也找不到>maxlen的回文子串了,故直接结束。

②遍历的时候需要过滤掉连续相同的字母,因为连续相同的字母一定回文,没必要再一个个遍历。

 1 //遍历判断
 2 string longestPalindrome(string s) {
 3     if(s.length() <= 1) return s;
 4     int start=0,maxlen=1;
 5     for(int i = 0;i<s.length();){
 6         if(s.length()-i < maxlen/2)break;//当剩下的字符串长度小于当前maxlen的一半时,说明遍历剩下的字符也找不到>maxlen的回文子串了,故直接结束。
 7         int left=i,right=i;
 8         while(s[right] == s[right+1] && right<s.length()-1){//过滤相同字母
 9             ++right;
10         }
11         while(s[left-1] == s[right+1] && left > 0 && right < s.length()-1){
12             --left;++right;
13         }
14         if(maxlen < right-left+1){
15             maxlen = right-left+1;
16             start = left;
17         }
18         i = right+1;
19     }
20     return s.substr(start,maxlen);
21 }

解法二

动态规划,时间复杂度O(n^2).

利用动态规划解题,i,j 分别表示子串的起始和结束位置,动态规划矩阵dp[i][j]表示以是第i个元素开始,以第j个元素结束的子串是否为回文串,是就记为1,否则记为0.

dp[i][j]的状态与dp[i+1][j-1]相关,及当dp[i+1][j-1]且s[i] == s[j]的时候,我们就可以判定dp[i][j] = 1;

dp[i][j] = (s[i] == s[j]) && (dp[i+1][j-1] || j-i<=1);

//动态规划
string dp_longestPalindrome(string s) {
    int size = s.length();
    if(size <= 1) return s;

    int left=0,right=0,maxlen=1;
    int dp[size][size]={0};
    for(int i = 0;i < size;++i){
        for(int j = i-1;j >= 0 ;--j){
            if(s[i]==s[j] && (i-j<=1 || dp[j+1][i-1])) dp[i][j] = 1;
            if(dp[j][i] && maxlen < i-j+1){
                maxlen = i-j+1;
                right = i;
                left = j;
            }
        }
        dp[i][i] = 1;
    }
    return s.substr(left,right-left+1);
}

解法三

马拉车算法Manacher‘s Algorithm, 时间复杂度O(n).

PS:这个算法我还没看太懂,后续再回来补充。

关于这个算法推荐学习博客:https://www.cnblogs.com/mini-coconut/p/9074315.html

原文地址:https://www.cnblogs.com/chenyingjie1207/p/9924661.html

时间: 2024-11-11 08:30:28

LeetCode 5. 最长回文子串 Longest Palindromic Substring的相关文章

[译]最长回文子串(Longest Palindromic Substring) Part II

[译+改]最长回文子串(Longest Palindromic Substring) Part II 问题:给定字符串S,求S中的最长回文子串. 在上一篇,我们给出了4种算法,其中包括一个O(N2)时间O(1)空间的算法(中心检测法),已经很不错了.本篇将讨论一个O(N)时间O(N)空间的算法,即著名的Manacher算法,并详细说明其时间复杂度为何是O(N). 提示 +BIT祝威+悄悄在此留下版了个权的信息说: 先想想有什么办法能改进中心检测法. 考虑一下最坏的情况.★ 最坏的情况就是各个回文

【中等】5-最长回文子串 Longest Palindromic Substring

题目 Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. Example1 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案. Example2 输

最长回文子串(Longest Palindromic Substring)-DP问题

问题描述: 给定一个字符串S,找出它的最大的回文子串,你可以假设字符串的最大长度是1000,而且存在唯一的最长回文子串 . 思路分析: 动态规划的思路:dp[i][j] 表示的是 从i 到 j 的字串,是否是回文串. 则根据回文的规则我们可以知道: 如果s[i] == s[j] 那么是否是回文决定于 dp[i+1][ j - 1] 当 s[i] != s[j] 的时候, dp[i][j] 直接就是 false. 动态规划的进行是按照字符串的长度从1 到 n推进的. DP算法实现: 1 packa

【算法】最长回文子串 longest palindrome substring

对于字符串S, 要找到它最长的回文子串,能想到的最暴力方法,应该是对于每个元素i-th都向左向右对称搜索,最后用一个数组span 记录下相对应元素i-th为中心的回文子串长度. 那么问题来了: 1. 这样的方法,对于奇回文子串和偶回文子串的处理不一样,比如所"acbca" 和"acbbca" 2. 计算冗余,e.g. "sscssabcccchccccba"中, 自左向右遍历计算的话,会发现, "abcccchccccba"是

LeetCode -- 5 -- 最长回文子串

给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: "aba"也是一个有效答案. 示例 2: 输入: "cbbd" 输出: "bb" std::string longestPalindrome(std::string s) { const int len = s.size(); if(1 >= len)

leetcode 5 最长回文子串问题

题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案.示例 2: 输入: "cbbd"输出: "bb" 方法一暴力求解: 定义一个n*n维的数组flage,flage[i][j] 表示以i开始,以j结束的回文串的长度,如果Si,,,,,,Sj是回文串,那么flage[i][

【Leetcode】最长回文子串

中心扩散法 我们观察到回文中心的两侧互为镜像.因此,回文可以从它的中心展开,并且只有 2n−1 个这样的中心. 你可能会问,为什么会是 2n−1 个,而不是 n 个中心?原因在于所含字母数为偶数的回文的中心可以处于两字母之间(例如“abba” 的中心在两个‘b’ 之间). 时间复杂度 O(n^2), 由于围绕中心来扩展回文会耗去 O(n) 的时间,所以总的复杂度为 O(n^2); 空间复杂度 O(1); 执行用时 : 128 ms, 在Longest Palindromic Substring的

[LeetCode系列] 最长回文子串问题

给定字符串S, 找到其子串中最长的回文字符串. 反转法: 反转S为S', 找到其中的最长公共子串s, 并确认子串s在S中的下标iS与在S'中的下标iS'是否满足式: length(S) = iS + iS' + length(s). 如果满足则s为搜索结果, 如果不满足我们就继续搜索. DP解法: 定义 P[i][j] = true  <-> Si...Sj是回文串, 否则为false; 则有 P[i+1][j-1] = true && Si = Sj <-> P[

[LeetCode] 5. Longest Palindromic Substring 最长回文子串

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 最长回文子串Longest palindromic substring, 最长回文子串或最长对称因子问题是在一个字符串中查找一个最长连续子串,这个子串