一、题意
给你一个字符串 s,找到 s 中最长的回文子串。
二、解法
解法一:
动态规划
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]代表了i到j是否是回文子串,由s[i]==s[j]和其之间字符子串
d
p
[
i
+
1
]
[
j
−
1
]
dp[i+1][j-1]
dp[i+1][j−1]是否是回文子串
以上是j-i>2的情况。
d
p
[
i
]
[
i
]
dp[i][i]
dp[i][i]是回文子串
d
p
[
i
]
[
i
+
1
]
=
s
[
i
]
=
=
s
[
i
+
1
]
dp[i][i+1]=s[i]==s[i+1]
dp[i][i+1]=s[i]==s[i+1]
时间复杂度:
O
(
n
2
)
O(n^2)
O(n2)
空间复杂度:
O
(
n
2
)
O(n^2)
O(n2)
解法二:
中心扩展法
三、代码
解法一:
string longestPalindrome(string s) {
int n=s.length();
vector<vector<int>> dp(n,vector<int>(n,0));
for(int i=0;i<n;i++){
dp[i][i]=1;
}
int begin = 0;
int maxLen = 1;
for(int m=1;m<n;m++){
for(int i=0;i<n;i++){
int j=m+i;
if(j>=n){
break;
}
if(s[i]==s[j]){
if(j-i<3){
dp[i][j]=1;
}
else{
dp[i][j]=dp[i+1][j-1];
}
}
else{
dp[i][j]=0;
}
if(dp[i][j]==1&&j-i+1>maxLen){
maxLen = j-i+1;
begin=i;
}
}
}
return s.substr(begin,maxLen);
}
四、总结
先放着,后面再来补其他方法。
五、引用
[1] leetcode:5. Longest Palindromic Substring
[2] leetcode:5. Longest Palindromic Substring官方解法