捡起算法,全靠大脑,完全没搜,这波给到一个人上人
复杂度 :n*n
核心思路 :遍历指针,并且以这个指针为中心,分别向两侧延伸来找回文串
注意:考虑回文串是奇数和偶数的情况(思路一样,就是遍历的指针个数不一样,奇数走一个,偶数走俩)
没看题解,写的思路简洁版代码,未优化(不过时间复杂度够了)
cpp
class Solution {
public:
string longestPalindrome(string s) {
string res="";
int m_len = 1;
for(int i=0;i<s.size();i++){ //回文串奇数,一个指针
int l = i-1;
int r = i+1;
int len = 1;
while(l>=0 && r<s.size()){
if(s[l]==s[r]){
len+=2;
l--;
r++;
}
else break;
}
if(len>m_len){
m_len = len;
res = s.substr(l+1,r-1-l); //l+1 ~ r-1之间
}
}
for(int i=0,j=1;i<s.size()-1,j<s.size();i++,j++){ //回文串是偶数,俩指针
if(s[i]==s[j]){
int l = i-1;
int r = j+1;
int len = 2;
while(l>=0 && r<s.size()){
if(s[l]==s[r]){
len+=2;
l--;
r++;
}
else break;
}
if(len>m_len){
m_len = len;
res = s.substr(l+1,r-1-l);
}
}
}
if(m_len==1){
res=res+s[0];
}
return res;
}
};