一、题目
给你一个字符串 s,找到 s 中最长的回文子串。
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
二、解法
思路:动态规划
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j] 表示下标从
i
i
i 至
j
j
j 的子串是否是回文串。显然
d
p
dp
dp 是一个半三角型,因为
i
>
j
i>j
i>j 时字符串无意义。可以列出转移方程:
d
p
[
i
]
[
j
]
=
d
p
[
i
+
1
]
[
j
−
1
]
&
&
S
[
i
]
=
=
S
[
j
]
dp[i][j]=dp[i+1][j-1]\&\&S[i]==S[j]
dp[i][j]=dp[i+1][j−1]&&S[i]==S[j]
要注意动态规划的循环次序:是从长度小的字符串转移到长度长的字符串,所以长度在循环的最外层。
class Solution {
public:
string longestPalindrome(string s) {
int n=s.size();
vector<vector<bool>> dp(n,vector<bool>(n,false));
int maxLen=0,begin;
for(int L=1;L<=n;++L){
for(int i=0;i<n;++i){
int j=i+L-1;
if(j>=n) break;
if(s[i]!=s[j]){
dp[i][j]=false;
}else{
if(j-i+1<=3) dp[i][j]=true;
else dp[i][j]=dp[i+1][j-1];
}
if(dp[i][j]&&maxLen<j-i+1){
maxLen=j-i+1;
begin=i;
}
}
}
return s.substr(begin,maxLen);
}
};