Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
之前写过一篇讲这个问题,但忘记当时有没有写代码了,这次写的时候发现那篇帖子里的代码有一些不妥的地方。
http://blog.youkuaiyun.com/a83610312/article/details/8544398
还是那个思路,注意除了要构造成 '#a#a#b#c' 这样,还要在头和尾添加两个不相同的字符’$','%'来做哨兵,防止越界。
另外 while(tmp[i-len[i]]==tmp[i+len[i]])
++len[i]
这一行之后要减一才行,大家可以举个例子试一下。
#define pb push_back
class Solution {
public:
string longestPalindrome(string s) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
string tmp=create(s);
int n=tmp.length();
vector<int> len(n,0);
int id=1,mx=1;
int ans=0,mxl=-1;
for(int i=2;i<n-1;i++)
{
if( i<mx )
len[i]=min(len[2*id-i],mx-i+1);
while(tmp[i-len[i]]==tmp[i+len[i]])
++len[i];
--len[i];
if ( i+len[i] > mx)
id=i,mx=i+len[i];
if( len[i] > mxl)
{
mxl=len[i];
ans=i;
}
}
int mid = ( (ans-1)>>1 );
int start=mid-(len[ans]>>1);;
return s.substr(start,mxl);
}
string create(string& s)
{
int n=s.length();
string news;
news.pb('$');
for(int i=0;i<n;i++)
{
news.pb('#');
news.pb(s[i]);
}
news.pb('#');
news.pb('%');
return news;
}
};