題目鏈結
題解:
我有四種方法,但是能夠通過時間限制的我這裡只有三種:**:暴力列舉(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 思路 從回文串的對稱點開始,依次向左向右比較,不相同的時候停止遍歷,直到找出最大的長度的回文...