Longest Palindromic Substring

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example:
Input: "babad"
Output: "bab"

Note: "aba" is also a valid answer.

Example:
Input: "cbbd"
Output: "bb"

這道題需要使用動態規劃,通過維護一個二維數組dp,其中dp[i][j]表示字符串區間[i, j]是否爲迴文串,當i = j時,只有一個字符,肯定是迴文串,如果i = j + 1,說明是相鄰字符,此時需要判斷s[i]是否等於s[j],如果i和j不相鄰,即i - j >= 2時,除了判斷s[i]和s[j]相等之外,dp[j + 1][i - 1]若爲真,就是迴文串,通過以上分析,可以寫出遞推式如下:

dp[i, j] = 1                                   if i == j                             
         = s[i] == s[j]                        if j = i + 1
         = s[i] == s[j] && dp[i + 1][j - 1]    if j > i + 1  

實現的代碼如下:

public:
    string longestPalindrome(string s) {
        int dp[s.size()][s.size()] = {0}, left = 0, right = 0, len = 0;
        for (int i = 0; i < s.size(); ++i) {
            for (int j = 0; j < i; ++j) {
                dp[j][i] = (s[i] == s[j] && (i - j < 2 || dp[j + 1][i - 1]));
                if (dp[j][i] && len < i - j + 1) {
                    len = i - j + 1;
                    left = j;
                    right = i;
                }
            }
            dp[i][i] = 1;
        }
        return s.substr(left, right - left + 1);
    }
};

但是提交之後發現效率並不是特別的高,有查了一些資料原來還有一種算法可以將複雜度遠遠降低,馬拉車算法
用該算法解決該問題的代碼如下:

class Solution {
public:
    string longestPalindrome(string s) {
        string t ="$#";
        for (int i = 0; i < s.size(); ++i) {
            t += s[i];
            t += '#';
        }
        int p[t.size()] = {0}, id = 0, mx = 0, resId = 0, resMx = 0;
        for (int i = 0; i < t.size(); ++i) {
            p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1;
            while (t[i + p[i]] == t[i - p[i]]) ++p[i];
            if (mx < i + p[i]) {
                mx = i + p[i];
                id = i;
            }
            if (resMx < p[i]) {
                resMx = p[i];
                resId = i;
            }
        }
        return s.substr((resId - resMx) / 2, resMx - 1);
    }
};

果然算法的複雜度提升了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章