好久没写博客了,今天重拾。。。。
- 最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
示例 3:
输入:s = “a”
输出:“a”
示例 4:
输入:s = “ac”
输出:“a”
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成
/*
* @lc app=leetcode.cn id=5 lang=cpp
*暴力的dp记录记录状态,dp[i][j]=true 表示从i-j的子串是回文串
*状态转移:dp[i][j] = dp[i + 1][j - 1];(该子串是回文串的时候 并且 子串左端、右端两个字符一样那么可以扩展成新的回文串)
*初始化:dp[i][i]=true
*注意判断回文串长度为2的时候的状态转移
*马拉车算法是O(N)的 但是我忘干净了(本来字符串的时候就迷迷瞪瞪的)
* [5] 最长回文子串
*/
// @lc code=start
class Solution {
public:
string longestPalindrome(string s) {
int n = s.size();
if(n < 2) {
return s;
}
int Maxlen = 1,begin = 0;
vector<vector<int>> dp(n, vector<int>(n));
for(int i=0; i<n; i++) dp[i][i] = true;
//枚举子串长度
for(int len=2; len<=n; len++) {
for(int i=0; i<n; i++) { // 左起点
int j = i + len - 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);
}
};
// @lc code=end