LeetCode——Longest Palindromic Substring

来源:互联网 发布:稳定的网络怎么 编辑:程序博客网 时间:2024/05/22 13:51

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;}



0 0