1. 程式人生 > >Leetcode解題筆記 5.Longest Palindromic Substring [Medium] 動態規劃解法

Leetcode解題筆記 5.Longest Palindromic Substring [Medium] 動態規劃解法

解題思路

題目要求我們尋找長度最長的子字串,考慮到由於題目符合運用動態規劃的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); }