您的位置:首页 > 其它

LeetCode——Longest Palindromic Substring

2015-06-07 15:17 309 查看

LeetCode——Longest Palindromic Substring

Leedcode 第五题:

题目如下:
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.

题目翻译:

求解最大回文子串

关于其他时间复杂度的算法就不总结了,这里一起来看一看O(n)的算法——Manacher算法

关于Manacher算法:
http://www.felix021.com/blog/read.php?2040 http://blog.csdn.net/jarily/article/details/8630841
#include<iostream>
#include<string>
#include<vector>
using namespace std;
string longestPalindrome(string s)
{
vector<char> cvec;
cvec.push_back('$');
cvec.push_back('#');
int i = 0;
for(;i<s.size();i++)
{
cvec.push_back(s[i]);
cvec.push_back('#');
}
vector<int> ivec;
int id = 0;//记录每个串的中心
int max = 0;//每个中心扩展的最大值
for(i=0;i<cvec.size();i++)
{
//if---else用于初始化记录每个回文子串的最大值的数组(这里用的vector容器)
//其中每个i满足P[i] >= MIN(P[2 * id - i], mx - i),这里我们用p表示记录值的数组
if(max>i)
{
int temp = ivec[2*id-i]>max-i?max-i:ivec[2*id-i];
ivec.push_back(temp);
}
else
ivec.push_back(1);
//while循环即用于处理p[i]> MIN(P[2 * id - i], mx - i)的情况
while(cvec[i+ivec[i]] == cvec[i-ivec[i]])
{
ivec[i] += 1;
}
if(ivec[i]+i>max)
{
max = ivec[i]+i;
id = i;
}
}
int mostlong = 0;//用于记录最大的值
int index = 0;
for(i=0;i<ivec.size();i++)
{
if(mostlong<ivec[i])
{
index = i;//记录最大的值的index
mostlong = ivec[i];
}
}
//cout<<mostlong<<" "<<index;
//分为奇数和偶数两种情况来返回要求的字符串
if(index%2==0)
{
index = index/2-1;
int t = (mostlong-2)/2;
string str(s.begin()+index-t,s.begin()+index+t+1);
return str;
}
else
{
index /=2;
int t = (mostlong-1)/2;
string str(s.begin()+index-t,s.begin()+index+t);
return str;
}
}
int main()
{
string s = "cabab";
cout<<longestPalindrome(s);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: