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);
}
};
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);
}
};
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- android string.xml文件中的整型和string型代替
- Android java 与 javascript互访(相互调用)的方法例子
- android上改变listView的选中颜色
- String.intern
- Prototype源码浅析 String部分(二)
- Ruby中的String对象学习笔记
- PostgreSQL ERROR: invalid escape string 解决办法
- 浅谈C++中的string 类型占几个字节
- 标准C++类string的Copy-On-Write技术
- C++实现string存取二进制数据的方法
- C#中string和StingBuilder内存中的区别实例分析
- PHP STRING 陷阱原理说明
- c#中 String和string的区别介绍
- C#实现的图片、string相互转换类分享
- asp.net String.IsNullOrEmpty 方法
- JavaScript中字符串(string)转json的2种方法
- C#中string用法实例详解
- C#中的DataSet、string、DataTable、对象转换成Json的实现代码
- Javascript实现Array和String互转换的方法