5. 最長迴文子串-JavaScript
阿新 • • 發佈:2020-08-03
題目: 給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為 1000。
示例 1:
輸入: "babad"
輸出: "bab"
注意: "aba" 也是一個有效答案
示例 2:
輸入: "cbbd"
輸出: "bb"
解題思路
對於一個子串而言,如果它是迴文串,並且長度大於 2,那麼將它首尾的兩個字母去除之後,它仍然是個迴文串。
例如對於示例1中的字串 "babad",若已知 “bab” 為迴文串,則去掉首尾字母 “b” 之後,“a”仍然是迴文串。若在迴文串“bab”首尾加上同一個字元“c”,即“cbabc”, 仍然是迴文串。因此,可以用動態規劃來解答。
特殊情況:
- case 1:"a" 為迴文串;
- case 2: "aa" 為迴文串;
其餘情況都可以用一個狀態轉移來表示:
dp(i,j)=(Si==Sj) ^ dp(i+1,j−1)
其中,dp[i][j] 表示 s[i][j] 是否為迴文串
程式碼
/** * @param {string} s * @return {string} */ var longestPalindrome = function(s) { if(s.length == 0) return ''; let res = s[0]; const dp = []; // 從後向前判斷迴文串,逐步延申字串 for(let i = s.length - 1; i >= 0; i--){ dp[i] = []; for(let j = i; j < s.length; j++){ // case1: a if(j - i === 0) dp[i][j] = true; // case2: aa else if(j - i == 1 && s[j] === s[i]) dp[i][j] = true; // state transition else if(s[i] === s[j] && dp[i + 1][j - 1]) dp[i][j] =true; // update res if(dp[i][j] && j - i + 1 > res.length) res = s.slice(i, j + 1); } } return res; };