LeetCode——Longest Palindromic Substring

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



你可能感兴趣的:(LeetCode——Longest Palindromic Substring)