難度中等2171收藏分享切換爲英文關注反饋
給定一個字符串 s
,找到 s
中最長的迴文子串。你可以假設 s
的最大長度爲 1000。
示例 1:
輸入: "babad" 輸出: "bab" 注意: "aba" 也是一個有效答案。
示例 2:
輸入: "cbbd" 輸出: "bb"
看到題目,首先想到的是兩層循環遍歷所有子串
這樣複雜度是n方
肯定超時了
換個思路
因爲是迴文串,兩邊對稱,想想可以從中間往兩邊走
文體兩開花,嘿嘿嘿
這樣是不斷擴增的,如果搜到某一個不是迴文串,那後面擴的也就不用看了,大大減少複雜度
看看代碼吧!
#include <iostream>
#include <cstring>
using namespace std;
string longestPalindrome(string s) {
int i, k;
int len = s.size();
int lenk = 0;
int maxlen = 0;
int lena; // 樣式a: abcba
int lenb; // 樣式b: abba
int flag = -1;
string re;
int resulti = 0;
int resultk = 0;
for(i = 0; i < len; i++){
int len2 = len / 2;
if(i <= len2){
lenk = i;
}
else{
lenk = len - i - 1;
}
// 樣式a的檢測,從中間往兩邊走
lena = 1;
for(k = 1; k <= lenk; k++){
if(s[i - k] == s[i + k]){
lena = 2 * k + 1;
}
else{
break;
}
}
if(lena > maxlen){
maxlen = lena;
flag = 0;
resulti = i;
resultk = k - 1;
}
// 樣式b的檢測,從中間往兩邊走
lenb = 0;
for(k = 0; k <= lenk; k++){
if(s[i - k] == s[i + k + 1]){
lenb = 2 * k + 2;
}
else{
break;
}
}
if(lenb > maxlen){
maxlen = lenb;
flag = 1;
resulti = i;
resultk = k - 1;
}
}
if(flag == 0){
re = s.substr(resulti - resultk, maxlen);
}
else{
re = s.substr(resulti - resultk, maxlen);
}
cout << re << endl;
return re;
}
int main(){
string s = "a";
longestPalindrome(s);
return 0;
}