區間DP解LeetCode 5 最長迴文子串

5. 最長迴文子串

給定一個字符串 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);	 
    }
};

 

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