5. 最长回文子串(动态规划、中心扩散)
题目描述
leetcode - 5:https://leetcode-cn.com/problems/longest-palindromic-substring/submissions/
解题关键
- 动态规划
- 中心扩散(比较好理解)
代码
1、暴力(会超时)
- 时间复杂度O(N^3),N 是字符串的长度
- 空间复杂度O(1)
bool testStr(string s){
int flag = true;
int start= 0;
int end = s.size()-1;
while( start <= end ){
if( s[start++] != s[end--] )
flag = false;
}
return flag;
}
string longestPalindrome(string s) {
string ans;
string test;
for(int i=0;i<s.size();i++){
for(int j=1;j<=s.size()-i;j++){
test = s.substr(i, j);
if(testStr(test) && test.size()>ans.size()){
ans = test;
}
}
}
return ans;
}
2、动态规划
状态转移方程:dp[i][j] = (s[i] == s[j]) and dp[i + 1][j - 1]
i和j是指s[i-j]的子字符串是不是回文串
- 时间复杂度O(N^2),N 是字符串的长度
- 空间复杂度O(N)
string longestPalindrome(string s) {
string ans=s.substr(0,1);
int len = s.size();
if(len == 0) return s;
bool dp[len][len];
for(int i=0;i<len;i++){
dp[i][i]=true;
}
for(int j=1;j<len;j++){
for(int i=0;i<j;i++){
if(s[i]!=s[j])
dp[i][j] = false;
else{
if(j-i<3){
dp[i][j] = 1;
}else{
dp[i][j] = dp[i+1][j-1];
}
}
if(dp[i][j] && j-i+1 > ans.size())
ans = s.substr(i, j-i+1);
}
}
return ans;
}
3、中心扩散
- 时间复杂度O(N^2),N 是字符串的长度
- 空间复杂度O(N)
string longestPalindrome(string s) {
int len = s.size();
if(len < 1 ) return s;
string ansLen;
for(int i=0;i<len;i++){
int len1 = test(s,i,i); // 奇数
int len2 = test(s,i,i+1); // 偶数
if(len1>len2){
ansLen = ansLen.size() > len1 ? ansLen: s.substr(i-len1/2,len1);
}else{
ansLen = ansLen.size() > len2 ? ansLen: s.substr(i-len2/2+1,len2);
}
}
return ansLen;
}
int test(string s,int left, int right){
int l=left,r=right;
while( l>=0 && r<=s.size() && s[l]==s[r] ){
l--;
r++;
}
return r-l-1;
}

浙公网安备 33010602011771号