給定一個字符串 s
,找到 s
中最長的迴文子串。你可以假設 s
的最大長度爲 1000。
示例 1:
輸入: "babad"
輸出: "bab"
注意: "aba" 也是一個有效答案。
示例 2:
輸入: "cbbd"
輸出: "bb"
思路:
區間DP
如果一個問題能夠先計算小區間,再從小區間枚舉到大區間,就可以使用區間DP
在這道題中,我們可以使用一個二維數組,存儲字符串區間是否是迴文串
dp[i,j]代表s[i....j]是否是迴文
那麼狀態轉移就是:如果一個區間是迴文串,只要在這個區間的前後兩個字母相等,那麼新的區間就是迴文串
子問題 dp[i+1,j-1]==true && s[i]==s[j] --> dp[i,j]=true
代碼:
class Solution {
public:
string longestPalindrome(string s) {
int n=s.size();
if(n==0) return "";
//區間DP dp[i,j]代表s[i..j]是否是迴文
//子問題dp[i+1,j-1]==true && s[i]==s[j] --> dp[i,j]=true
vector<vector<bool> > dp(n,vector<bool>(n,false));
int start=0,end=0;
//遍歷dp計算數組 i代表區間長度
for(int i=1; i<=n;i++)
{
//j代表區間起點
for(int j=0; j<n; j++)
{
int l = j;
int r = j+i-1;
if( r >= n ) break;
if( i == 1 )
{
dp[l][r] = 1;
continue;
}
if(s[l]==s[r] && (i == 2 || dp[l+1][r-1]) )
{
dp[l][r] = true;
start = l;
end = r;
}
}
}
return s.substr(start,end-start+1);
}
};