5、Longest Palindromic Substring
最長迴文子串
給出一個字符串(假設長度最長爲1000),求出它的最長迴文子串,你可以假定只有一個滿足條件的最長迴文串。
給出字符串 "abcdzdcab"
,它的最長迴文子串爲 "cdzdc"
。
O(n2) 時間複雜度的算法是可以接受的,如果你能用 O(n) 的算法那自然更好。
我的代碼:
class Solution {
public:
string longestPalindrome(string s) {
if(s.empty())return "";//字符串爲空
if(s.size()==1)return s;//字符串爲1
int start=0,max_len=1;//迴文串開始位置,迴文串長度
for(int i=0;i<s.size();i++)
{
if(s.size()-i<=max_len)break;//剩餘字符串長度小於已知的迴文串長
int l=i,r=s.size()-1,last=r;//左邊元素,右邊元素,迴文串結束位置
bool FF=false;//觸發器(對應元素是否相等)
while(l<=r&&last-i+1>max_len)//迴文串未遍歷完,迴文串大於已知長度
{
if(s[l]==s[r]){l++;r--;FF=true;}//對應元素相等,左右移動
else {l=i;last--;r=last;FF=false;}//不等,回到初始位置,右邊界移動
}
if(FF==true&&last-i+1>max_len)//替換最大回文串
{
start=i;
max_len=last-i+1;
}
}
return s.substr(start,max_len);//(字符串開始位置,和長度)
}
};
經典代碼:
lass Solution {
public:
/*
題意爲求最長迴文子串, 直接枚舉子串首尾位置再判斷是否會問,時間複雜度爲O(N^3),
換個思路,枚舉迴文串的對稱中心位置,向兩側掃描檢測最長迴文長度時間複雜度爲O(N^2)
對於最長迴文子串問題有對應O(N)算法--Manacher算法
*/
string longestPalindrome(string s) {
string str = "", ans = "";
int len = s.length();
int maxl = -1, cnt;
for (int i = 0; i < len; i++) {
str += '#';
str += s[i];
}
str += '#';
// 將原字符串擴展成#a#b#的形式可以直接枚舉長度,不用考慮迴文串長度的奇偶性
for (int i = 1; i < 2 * len; i++) {
cnt = 0;
while ((i - cnt >= 0) && (i + cnt <= 2 * len) && (str[i - cnt] == str[i + cnt]))
cnt++;
cnt--;
if (cnt > maxl) {
maxl = cnt;
ans = s.substr((i - cnt) / 2, (i + cnt) / 2 - (i - cnt) / 2);
}
}
return ans;
}
};