[5]. 最长回文子串

Posted Debroon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[5]. 最长回文子串相关的知识,希望对你有一定的参考价值。

[5]. 最长回文子串

 


题目

传送门:https://leetcode.cn/problems/longest-palindromic-substring/

 


算法设计:双指针

检查回文串的通用解决方案是,双指针。

寻找回文串的思想是:从中间开始向俩边扩散来判断回文串。

回文串在长度为奇数和偶数的时候,中心不一样:

  • 奇数回文串的「中心」是一个具体的字符,如回文串 aba 的中心是字符 b
  • 偶数回文串的「中心」是位于中间的两个字符的「空隙」,如回文串 abba 的中心是两个 b,也可以看成两个 b 中间的空隙。

for(int i=0; i<len(s); i++)
	奇数:找到以 s[i] 为中心的回文串
	偶数:找到以 s[i] 和 s[i+1] 为中心的回文串
	根据找到的回文串,更新最长子串

代码实现:

class Solution 
	string res;
public:
    string mid(string& s, int l, int r)                // 中心扩散,俩指针可同时处理回文长度为奇数、偶数情况
	    while( l>=0 && r<s.size() && s[l] == s[r] )     // 如果对应相等,判断边界合法 && 是回文,顺序不能变,必须先判断边界,再判断回文,如 l=0,s[0-1]就会越界
        		    l --, r ++;                         // 从中心扩散,去探下一个位置
	    return s.substr( l + 1, r - l - 1 );            // 最长回文串,从指定位置开始,复制指定的长度
    

    string max3(string res, string s1, string s2)      // 寻找最长串
        res = res.size() > s1.size() ? res : s1;
        res = res.size() > s2.size() ? res : s2;
        return res;
    

    string longestPalindrome(string s) 
		for(int i=0; i<s.size(); i++)                 // 枚举所有的中心点
			string s1 = mid(s, i, i);                  // 寻找奇数回文子串
			string s2 = mid(s, i, i+1);                // 寻找偶数回文子串
			res = max3(res, s1, s2);                   // 寻找最长回文子串
		
		return res;
    
;

时间复杂度: Θ ( n 2 ) \\Theta(n^2) Θ(n2)

空间复杂度: Θ ( 1 ) \\Theta(1) Θ(1)

 


算法设计:Manacher 算法

以上是关于[5]. 最长回文子串的主要内容,如果未能解决你的问题,请参考以下文章

5. 最长回文子串

5-最长回文子串

[5]. 最长回文子串

5. 最长回文子串

最长回文子序列(不连续)以及最长回文子串(连续)

5. 最长回文子串