leetcode第五題—最長迴文字符串

最長迴文字符串(Longest Palindromic Substring )



1.中心結點法,時間複雜度爲O(n^2)
迴文字符串都是對稱的,有兩種對稱方式,一是關於字符對稱,比如a,aba,cabac,這種迴文字符串長度都是奇數;二是關於間隔對稱,比如aa,abba,cbaabc,這種迴文字符串長度都是偶數,所以要分別檢測這兩種情況。
中心結點法,就是遍歷整個字符串,分別設爲中心結點,然後第二個遍歷是分別對設定的中心向左右擴展,所以複雜度爲o(n^2)。
比如對於字符串abba,先檢測關於字符對稱,設定中心爲a,發現最長迴文爲a,再檢測關於間隔對稱,給定中心爲ab之間間隔,發現最長迴文爲空。然後座標前移,設定中心爲b,發現最長迴文爲b,再設定中心爲bb的間隔,發現最長迴文爲abba,爲目前最長,所以最長迴文設爲abba,然後座標前移,繼續檢測。

給定字符串和中心結點及字符串長度,返回以該結點爲中心的最長迴文字符串
string expandAroundCenter(string &s,int pos1,int pos2,int n)
{
	int lt=pos1;
	int rt=pos2;
	while(lt>=0&&rt<=n-1&&s[lt]==s[rt])
	{
		lt--;
		rt++;
	}
	return s.substr(lt+1,rt-lt-1);
}

給定字符串,返回最長迴文字符串,通過遍歷設定中心結點,調用上面的函數實現
string longestPalindrome(string &s)
{
	int n=s.size();
	if(n==0)
		return " ";
	string longest=s.substr(0,1);


	for(int i=0;i<n-1;i++)
	{
		//center is the character,the length is must be odd
		//like aba  cabac
		string p1=expandAroundCenter(s,i,i,n);
		if(p1.size()>longest.size())
			longest=p1;

		//center is the interval,the length is must be  even
		//like  bb  abba  cabbac
		string p2=expandAroundCenter(s,i,i+1,n);
		if(p2.size()>longest.size())
			longest=p2;
	}

	return longest;
}




















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章