码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode - Longest Palindromic Substring

时间:2015-06-20 17:07:53      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:

题目:

Longest Palindromic Substring

 

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.


分析:

运用manacher算法,实现O(n)时间复杂度。参考这里

class Solution {
public:
	string longestPalindrome(string s) {
		if (s.empty())
			return s;
		if (s.size() <= 2)
		{
			if (s[0] == s[s.size() - 1])
				return s;
			else
				return s.substr(0, 1);
		}

		int size = s.size();
		string str(2 * size + 1, '#');
		for (int i = 0, j = 1; i<size; ++i, j += 2)
		{
			str[j] = s[i];
		}

		size = str.size();
		vector<int> f(size, 0);
		f[1] = 2;
		//max_len是str最大半径,max_center是取值max_len时的下标
		int max_len = 2, max_center = 1;
		//cur_right是当前半径向右延伸所能到达的最大下标,center是取值cur_right时的下标
		int cur_right = 2, center = 1;
		for (int i = 2; i <= size - 3; ++i)
		{
			if (i>cur_right)
			{
				int r = 1;
				while (i - r >= 0 && i + r<size && str[i - r] == str[i + r])
					++r;
				f[i] = r;
			}
			else
			{
				int i2 = center * 2 - i, i2_left = i2 - f[i2] + 1, center_left = center - f[center] + 1;
				if (i2_left<center_left)
				{
					f[i] = cur_right - i + 1;
				}
				else if (i2_left == center_left)
				{
					int r = cur_right - i + 1;
					while (i - r >= 0 && i + r<size && str[i - r] == str[i + r])
						++r;
					f[i] = r;
				}
				else
				{
					f[i] = f[i2];
				}

			}
			//更新max_len和max_center
			if (f[i]>max_len)
			{
				max_len = f[i];
				max_center = i;
			}
			//更新cur_right和center
			if (i + f[i] - 1>cur_right)
			{
				cur_right = i + f[i] - 1;
				center = i;
			}

		}

		string res = str.substr(max_center - max_len + 1, 2 * max_len - 1);
		//删除字符 '#'
		res.erase(remove(res.begin(), res.end(), '#'), res.end());
		return res;

	}
};


leetcode - Longest Palindromic Substring

标签:

原文地址:http://blog.csdn.net/bupt8846/article/details/46574249

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!