LeetCode 5 Longest Palindromic Substring
求最大回文串
1最初想用最长公共子序列,但是有问题,怎么改??
2 动态规划
根据回文串的性质,如果s[i+1]-s[j-1]为回文串,并且s[i]==s[j],那么我们可以得到s[i]-s[j]为回文串。但是这里要注意初始化问题:单个字母一定是回文串。并且由于s[i+1]-s[j-1]的间隔为2,所以两个连续的字母必须单独来考虑。同时,dp[i][j]的状态是由dp[i+1][j-1]推出,所以i要从后往前
class Solution { public: string longestPalindrome(string s) { int len=s.length(); vector<vector<int>> dp(len, vector<int>(len, 0)); int start=0,maxn=1; for(int i=0;i<len;i++) { dp[i][i]=1; if(i+1<len&&s[i]==s[i+1]) { dp[i][i+1]=1; start=i; maxn=2; } } for(int i=len-2;i>=0;i--) { for(int j=i+2;j<len;j++) { if(s[i]==s[j]&&dp[i+1][j-1]==1) { dp[i][j]=1; if(j-i+1>maxn) { start=i; maxn=j-i+1; } } } } return s.substr(start,maxn); } };
3 马拉车