lc5-最长回文子串
题目
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:”bab”
解释:”aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:”bb”
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Code
MyCode
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| class Solution { public: string longestPalindrome(string s) { int len=s.size(); string s1=s; reverse(s1.begin(),s1.end()); if(s1==s)return s; int dp[1010][1010]={0}; int cur_len=1; string rs=""; rs+=s[0]; for(int i=0;i<len;i++) { dp[i][i]=1; if(i!=len-1&&s[i]==s[i+1]) { dp[i][i+1]=1; cur_len=2; rs=s.substr(i,2); } } for(int i=3;i<=len;i++) { for(int j=0;j<=len-i;j++) { if(dp[j+1][j+i-2]==1&&s[j]==s[j+i-1]) { dp[j][j+i-1]=1; if(cur_len<i) { cur_len=i; rs=s.substr(j,i); } } } } return rs; } };
|
Standard_Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #include <iostream> #include <string> #include <vector> using namespace std; class Solution { public: string longestPalindrome(string s) { int n = s.size(); if (n < 2) { return s; } int maxLen = 1; int begin = 0; vector<vector<int>> dp(n, vector<int>(n)); for (int i = 0; i < n; i++) { dp[i][i] = true; } for (int L = 2; L <= n; L++) { for (int i = 0; i < n; i++) { int j = L + i - 1; if (j >= n) { break; } if (s[i] != s[j]) { dp[i][j] = false; } else { if (j - i < 3) { dp[i][j] = true; } else { dp[i][j] = dp[i + 1][j - 1]; } } if (dp[i][j] && j - i + 1 > maxLen) { maxLen = j - i + 1; begin = i; } } } return s.substr(begin, maxLen); } };
作者:LeetCode-Solution 链接:https: 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
|
Solution&Key Points
递推关系:P(i,j)=P(i+1,j-1) && s[i]==s[j]
边界条件:P(i,i)=1
遍历方法:固定子串长度进行遍历,方可通过递推关系不遗漏所有情况