Question5—Longest Palindromic Substring
题目描述:找出给定字符串(长度不超过1000)中的最长回文子字符串
Solution:
1.一开始直接想到的就是把给定字符串中的每个子字符串判断一遍,看是否是回文字符串,并记下长度以比较。
代码如下:
class Solution {
public:
string longestPalindrome(string s) {
int max=0;
int maxlowboud;
for(int i=0; i<s.size(); i++)
for(int j=i; j<s.size(); j++){
if(ispalindmc(s,i,j)){
if(max<(j-i+1)){
maxlowboud=i;
max=j-i+1;
}
}
}
return s.substr(maxlowboud,max);
}
bool ispalindmc(string s, int i, int j){
if(i==j) return true;
char *front, *back;
front=&s[i];
back=&s[j];
while(front<back){
if(*front!=*back) return false;
front++;
back--;
}
return true;
}
};
但该方法的时间复杂度为O(n^3)
2.改进了一下,用枚举中心位置的方法,以回文字符串的中间为起点向两遍扩散来判断。这样时间复杂度就会降到O(n^2)
代码如下:
class Solution {
public:
string longestPalindrome(string s) {
int max=0;
int start;
for(int i=0; i<s.length(); i++){
int len1=lengthofpalindmc(s,i,i);
int len2=lengthofpalindmc(s,i,i+1);
int max1=len1>len2?len1:len2;
if(max<max1){
max=max1;
start=i-(max-1)/2;
}
}
return s.substr(start,max);
}
int lengthofpalindmc(string s, int i, int j){
while(i>-1&&j<s.length()&&s[i]==s[j]){
i--;
j++;
}
return j-i-1;
}
};