Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.面試
Example1:算法
Input: "babad"編程
Output: "bab"bash
Note: "aba" is also a valid answer.學習
Example2:ui
Input: "cbbd"spa
Output: "bb"3d
Example1: 輸入: "babad"code
輸出: "bab"orm
注意: "aba" 是一個有效答案.
Example2:
輸入: "cbbd"
輸出: "bb"
通常開發者,能想到的最快速的方法,就是找到"最長公共子串".
"反轉S併成爲S',找到S和S'之間的最長公共子串.它也必須是最長的迴文子串"
注意: 若是咱們並非全部的最長公共子串,就必定是最長迴文子串.
因此,若是隻是單純的查找最長公共子串方法,是不可行的.可是,若是去修改這個問題?
思路: 在咱們找到一個最長的公共子串候選者時,咱們檢查子串的索引是否與反向子串的原始索引相同.若是是,那麼嘗試更新到目前爲止發現的最長的迴文.若是沒有,咱們就跳過這個,尋找下個候選迴文子串.
Si...Sj
是迴文,則定義P[i,j]
爲真,不然爲假P[i,j] <-- (p[i+1,j-1] 和 Si = Sj)
;時間複雜度:O(N*N)
空間複雜度:O(N*N)
C Code
string longestPalindromeDP(string s) {
int n = s.length();
int longestBegin = 0;
int maxLen = 1;
bool table[1000][1000] = {false};
for (int i = 0; i < n; i++) {
table[i][i] = true;
}
for (int i = 0; i < n-1; i++) {
if (s[i] == s[i+1]) {
table[i][i+1] = true;
longestBegin = i;
maxLen = 2;
}
}
for (int len = 3; len <= n; len++) {
for (int i = 0; i < n-len+1; i++) {
int j = i+len-1;
if (s[i] == s[j] && table[i+1][j-1]) {
table[i][j] = true;
longestBegin = i;
maxLen = len;
}
}
}
return s.substr(longestBegin, maxLen);
}
複製代碼
嘗試畫圖->閱讀代碼