1. 程式人生 > >【leetcode】5. 最長迴文子串

【leetcode】5. 最長迴文子串

我們就可以在 O(n^2)O(n2) 的時間內解決這個問題。

我們觀察到迴文中心的兩側互為映象。因此,迴文可以從它的中心展開,並且只有 (2n - 1 )個這樣的中心。

你可能會問,為什麼會是 2n - 12n−1 個,而不是 nn 箇中心?原因在於所含字母數為偶數的迴文的中心可以處於兩字母之間(例如 “abba”的中心在兩個‘b’ 之間)。

示例程式碼:

#include<iostream>
#include<string>
using namespace std;

//求字串以start為開始時的最長迴文串
int expandAroundCenter(string s, int start, int end)
{
	while (start >= 0 && end < s.length() && (s.at(start) == s.at(end)))
	{
		start--;
		end++;
	}
	//因為start--和end++後此時的值已經不是迴文字元.
	//完整式子為(end-1)-(start+1)+1
	return end - start -1;
}

string longestPalindrome(string s)
{
	//定義最長迴文子字串的起始和終止位置
	int start = 0, end = 0;
	for (int i = 0;i < s.length();i++)
	{
		int iLength = expandAroundCenter(s, i, i);
		int isspaceLength = expandAroundCenter(s, i, i + 1);
		//選最大長度
		int maxLength = iLength > isspaceLength ? iLength : isspaceLength;
		//更新start和end;
		if (maxLength > end - start + 1)
		{
			//偶數長度
			if (maxLength % 2 == 0)
			{
				start = (i + 1) - maxLength / 2;
				end = i + maxLength / 2;
			}
			else
			{
				start = i - maxLength / 2;
				end = i + maxLength / 2;
			}
		}
	}
	//返回迴文字串
	return s.substr(start, end - start + 1);

}

int main()
{
	string s1 = "babad";
	string s2 = "cbbd";
	cout << longestPalindrome(s1) << endl;
	cout << longestPalindrome(s2) << endl;


	return 0;
}