5_LongestPalindromicSubstring - a920604a/leetcode GitHub Wiki
title: 5. Longest Palindromic Substring
最長回文子字串
Manacher's algorithm is
- 利用雙索引,從拜訪到的字元,當拜訪到字元,相鄰字元都一樣,則向左向右擴散
class Solution {
public:
string longestPalindrome(string s) {
int l =0,r = 0, n =s.size(), start = 0, len = 1;
for(int i=0;i<n;){
l=r=i;
while(r+1<n && s[r] == s[r+1]) r++;
i = r+1;
while(l>0 && r<n-1 && s[l-1] == s[r+1]){
l--;
r++;
}
if(r-l+1>len){
len = r-l+1;
start = l;
}
}
return s.substr(start, len);
}
};
char * longestPalindrome(char * s){
int len = 1, start = 0;
int size ;
for(size =0;s[size]!='\0';size++);
for(int i=0;i<size;){
int l=i,r=i;
while(r+1<size && s[r+1] == s[r]) r++;
i = r+1;
while(l-1>-1 && r+1<size && s[l-1] == s[r+1]){
l--;
r++;
}
if(r-l+1 > len){
len = r-l+1;
start = l;
}
}
char *ret = malloc(sizeof(char)*(len+1));
for(int i=start;i<start+len;++i) ret[i-start] = s[i];
ret[len] = '\0';
return ret;
}
class Solution {
public:
string longestPalindrome(string s) {
int n = s.size();
vector<vector<int>> dp(n, vector<int>(n,0));
// b a b a d
//
//b 1 0 3 0 0
//a 1 0 3 0
//b 1 0 3
//a 1 0
//d 1
int start = 0, len =1;
for(int i=0;i<n;++i) dp[i][i] =1;
for(int i=n-2;i>-1 ;i--){
for(int j = i+1; j<n;++j){
if(s[i] == s[j] && (j-i==1 || dp[i+1][j-1] > 0)){
// ex: "tt"
// ex: babab , dp[i+1][j-1]確保 aba 是回文,才將i往左一格 j 往右一格
dp[i][j] = 2+dp[i+1][j-1];
if(j-i+1>len){
start = i;
len = j-i+1;
}
}
}
}
return s.substr(start, len);
}
};
- option 1 - two pointers
- time complexity
O(n^2)
- space complexity
O(1)
- time complexity
- option 2 - dp
- time complexity
O(n^2)
- space complexity
O(n^2)
- time complexity