区间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);	 
    }
};

 

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