您的位置:首页 > 其它

leetcode 5. Longest Palindromic Substring

2016-03-11 21:11 435 查看
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.思路 

解法一:经典的manacher算法。。。详见:http://blog.csdn.net/yzl_rex/article/details/7908259

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);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode string