Leetcode解題筆記 5.Longest Palindromic Substring [Medium] 動態規劃解法
阿新 • • 發佈:2018-12-29
解題思路
題目要求我們尋找長度最長的子字串,考慮到由於題目符合運用動態規劃的3個性質——最優化原理、無後效性、有重疊子問題,所以可以用動態規劃的方法。難點在於構造如何設定子問題,怎麼初始化,以及怎麼遍歷。
構建子問題:
設d[i][j]表示字串s從第i個字元到第j個字元為迴文(字串從0開始),則
若d[i+1][j-1] == true,並且s[i] == s[j],則d[i][j] == true;
初始化
由於演算法執行只能判斷3個字元以上回文的情況,我們要預先對d[i][i], d[i][i+1]進行賦值。
遍歷
為了避免考慮字串邊界的問題,需要謹慎設計迴圈,參考上面給出的連結,裡面沒有直接拿i
j
去進行迴圈,而是巧妙地把j
設為i - len + 1
,從而避免了出界。
程式碼
#define MAX_N 1000
string longestPalindrome(string s) {
bool f[MAX_N][MAX_N] = {false};
// 情況一
int begin = 0;
int maxLen = 1;
for (int i = 0; i < s.length(); i++) {
f[i][i] = true;
}
// 情況二
for (int i = 0; i < s.length() - 1 ; i++) {
if (s[i] == s[i + 1]) {
begin = i;
maxLen = 2;
f[i][i + 1] = true;
}
}
// 情況三
for (int len = 3; len <= s.length(); len++) {
for (int i = 0; i < s.length() - len + 1; i++) {
int j = i + len - 1;
if (s[i] == s[j] && f[i + 1][j - 1]) {
maxLen = len;
begin = i;
f[i][j] = true;
}
}
}
return s.substr(begin, maxLen);
}