最长回文子串

Posted cs0915

tags:

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

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

示例 1:

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

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

暴力解法:

思路:从字符串中选出一个子串,其中子串的开头字符和末尾字符一样,用一个函数Palindrome来判断该子串是否为回文,若是则与max(记录目前为止找到的最长回文的长度)进行比较看最长回文是否要修改;若不是则寻找下一个。

 1 class Solution {
 2 public:
 3     bool Palindrome(string& s,int start,int end)
 4     {
 5         while(start<=end)
 6         {
 7             if(s[start]!=s[end])
 8                 return false;
 9             else 
10             {
11                 start++;end--;
12             }
13         }
14         return true;
15     }
16     string longestPalindrome(string s) {
17         int start(0);int n=s.size();int end=n-1;
18         int max(0);int maxnew(0);string maxstr="";
19         while(start<=end)
20         {
21             for(;end>=start;end--)
22             {
23                 if(s[end]==s[start])
24                     if(Palindrome(s,start,end))//是回文子串
25                         {
26                             maxnew=end-start+1;
27                             if(maxnew>max)//判断是不是最长
28                             {
29                                 max=maxnew;
30                                 maxstr=s.substr(start,end-start+1);//是最长则修改
31                                 //拷贝s从start开始的end-start+1个字符
32                                 break;
33                             }                   
34                         }
35             }
36             start++;
37             end=n-1;
38         }
39         return maxstr;
40     }
41 };

 

中心扩展法:

思路:

我们知道回文串一定是对称的,所以我们可以每次循环选择一个中心,进行左右扩展,判断左右字符是否相等即可。

 技术图片

 

 

由于存在奇数的字符串和偶数的字符串,所以我们需要从一个字符开始扩展,或者从两个字符之间开始扩展

 

 1 class Solution {
 2 public:
 3     string longestPalindrome(string s) {
 4        int n=s.size();
 5        if(n==0) return "";
 6        int start(0);int max(0);string maxst;int len;
 7        for(int i=0;i<n;i++)
 8        {
 9            int len1=lengthPalindrome(s,i,i);
10            int len2=lengthPalindrome(s,i,i+1); 
11            len=len1>len2?len1:len2;
12            if(len>max)//len>max,必定要修改
13            {//选len1、len2中最大的那个来和max比较,看是否要修改最长回文子串
14               if(len1>=len2)
15               {
16                max=len1;
17                start=i-len1/2;
18                maxst=s.substr(start,len1);
19               }
20               else    //len2>len1
21               {
22                max=len2;
23                start=i+1-len2/2;
24                maxst=s.substr(start,len2);
25               }
26            }                  
27        }
28        return maxst;
29     }
30 private:
31     int lengthPalindrome(string& s,int left,int right)
32     {
33         int n=s.size();int ans(1);
34         while(left>=0&&right<n)
35         {
36             if(s[left]==s[right])
37             {
38                 ans=right-left+1;
39                 left--;right++;
40             }
41             else break;
42         }
43        return ans;
44     }
45 };

 

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

华为机试题 HJ85最长回文子串

最长回文字串暴力

Leetcode 5. 最长回文子串

找到最长的回文子串

最长回文子串(python)

字符串最长回文子串 ( 动态规划算法 ) ★