1.题目
Total Accepted: 98199
Total Submissions: 432790
Difficulty: Medium
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.
求一个字符串的最长回文子串。
2.思路
class Solution {
public:
string changeStr(string s){
string newStr;
newStr += "@#";
for(int i=0;i<s.size();i++){
newStr.push_back(s[i]);
newStr.push_back('#');
}
return newStr;
}
string longestPalindrome(string s) {
int i,id=0,mx=0,maxpid=0,maxplen=1;
string ans;
string newStr = changeStr(s);
vector<int> p(newStr.size());
for(int i=0;i<newStr.size();i++){
if(mx>i)
p[i] = min(p[2*id-1],mx-i); //核心
else
p[i]=1;
while(newStr[i-p[i]] == newStr[i+p[i]]) p[i]++; //扩充p[i]的边界
if(p[i]+i > mx){
mx = p[i]+i;
id = i;
}
if(p[i] > maxplen){//更新p[]的最大值
maxpid = i;
maxplen = p[i];
}
}
for(i=maxpid-maxplen+1;i<=maxpid+maxplen-1;i++){
if(newStr[i] == '#') continue;
else ans.push_back(newStr[i]);
}
return ans;
}
};
解法二:leetcode上Feb 20的答案,不需要附加“#”:
class Solution {
public:
string longestPalindrome(string s) {
int n = s.length(), i;
if(n<2)
return s;
int leftMost=0, rightMost=0;
i = 0;
int start, end;
while(i<n)
{
start = i;
end = i;
i++;
while(i<n && s[i]==s[start])
{
i++;
}
end = i-1;
while(start-1>=0 && end+1<n && s[start-1]==s[end+1])
{
start--;
end++;
}
if(rightMost-leftMost <= end-start)
{
leftMost = start;
rightMost = end;
}
}
return s.substr(leftMost, rightMost-leftMost+1);
}
};