5-最长回文子串

题干

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-palindromic-substring/

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

给你一个字符串 s,找到 s 中最长的回文子串。

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

1
2
3
4
5
6
7
8
9
10
示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:

输入:s = "cbbd"
输出:"bb"

1
2
3
4
提示:

1 <= s.length <= 1000
s 仅由数字和英文字母组成

思路

考虑动态规划:一个字符串是回文串,那么可以从每个位置往两端扩展。枚举位置和长度。

官方思路学习: https://leetcode.cn/problems/longest-palindromic-substring/solutions/255195/zui-chang-hui-wen-zi-chuan-by-leetcode-solution/

AC 代码

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
class Solution {
public:
string longestPalindrome(string s) {
int len = s.length();

if(len < 2){
return s;
}

vector<vector<int>> dp(len,vector<int>(len));
int maxlen = 1,begin = 0;

for(int i = 0; i < len; i ++){
dp[i][i] = true;
}

int j;
for(int L = 2; L <= len; L ++){
for(int i = 0; i < len; i++){
j = i + L - 1;
if(j >= len){
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);
}
};

5-最长回文子串
https://www.bencorn.com/2023/08/09/5-最长回文子串/
作者
Bencorn
发布于
2023年8月9日
许可协议