LeetCode演算法題解 5 最長回文子串

2021-09-27 12:44:54 字數 2134 閱讀 9981

題目鏈結

題解:

我有四種方法,但是能夠通過時間限制的我這裡只有三種:

暴力列舉(o(n3) - 超時)

動態規劃演算法(o(n2) - 400ms左右)

中心向外擴充套件法(o(n2) - 28ms左右)

最標準的演算法:manacher演算法(馬拉車演算法)(o(n) - 8ms左右) (這就是中心向外擴充套件法的優化

具體的演算法思想,特別是manacher演算法,這個需要好些理解,我這裡看不懂的(我也不太懂),就去專門講馬拉車演算法的文章

**:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const int inf = 0x3f3f3f3f;

const ll inf = 0x3f3f3f3f3f3f3f3f;

const double pi = acos(-1.0);

const double e = exp(1.0);

const int mod = 1e9+7;

const int max = 1e3+5;

// 1.o(n3)暴力解法(超時)

string longestpalindrome1(string str)

if(flag)

break;// 因為是終點j是從大到小的,如果有滿足的回文子串直接break}}

}string rs;

rs.assign(str,s,e-s+1);

return rs;

}// 2.o(n2)動態規劃解法(錯誤)

int dp[max][max];// 注意:1e3 的二維陣列只能開成全域性變數(在leetcode也是)

string longestpalindrome2(string str)

for(int i = 0; i < len_str; i++)

else

}if(dp[j][i] && (i-j+1 > max_len))}}

cout << max_len << endl;

return str.substr(s,max_len);

}// 3.o(n2)中心向外擴充套件法(通過)

string longestpalindrome3(string str)

l--;

r++;

}else

}/** 然後是將子串看作是偶數個數 */

l = i;

r = i+1;

while(l >= 0 && r <= len_str-1)

l--;

r++;

}else}}

return str.substr(s,e-s+1);

}// 4.o(n)manacher(通過)

string longestpalindrome4(string str)

new_str += "#";

int r = -1;/** 右邊界 */

int c = -1;/** 此時的中心位置 */

int max_len = 0;

int mid = 0;

for(int i = 0; i < 2*len_str+1; i++)

else

}/** 超出了右邊界,右邊界需要更新,並記錄下此時的中心位置 */

if(i+radius[i] > r)

/** 記錄以某個字元為中心的最長回文串長度 */

if(radius[i] > max_len)

}max_len--;

return str.substr((mid-max_len+1)/2,max_len);

}int main()

return 0;

}

LeetCode演算法5 最長回文字串

題目描述 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 問題評價 最重要在於判別函式的引入,可以簡化程式的結構 解題思路 邊界問題 1 對於空字串,...

LeetCode演算法題解答

leetcode演算法題解答 第四題 尋找兩個有序陣列的中位數 給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。def findmedianso...

LeetCode5 最長回文串

include include include include include include using namespace std ifndef solution h define solution h 思路 從回文串的對稱點開始,依次向左向右比較,不相同的時候停止遍歷,直到找出最大的長度的回文...