1. 程式人生 > >LeetCode程式設計題:最長迴文子串

LeetCode程式設計題:最長迴文子串

給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為 1000。

示例 1:
輸入: “babad”
輸出: “bab”
注意: “aba” 也是一個有效答案。

示例 2:
輸入: “cbbd”
輸出: “bb”

演算法思路分析:迴文子串有兩種一種的單點對稱中心,形如“aba”,而另外一種就是雙點對稱中心,形如“abba”。所以只要在原字串中尋找出最長的字串即可。由於涉及到對稱中心點的問題,所以自然而然的想到利用for迴圈遍歷字串,以及雙指標圍繞對稱中心進行前後移動。

string longestPalindrome(string str) {
        int length = str.size();
		int max = 0;//最大的的長度
		int maxBegin = 0;//最大長度的起始位置
		for (int i = 0; i < length; ++i) {
			//從下標開始遍歷每一個以當前字元為中心的最長字元
			int tempMax = 1;//中間暫時最長迴文子串的長度
			int strTempBegin = i - 1;//待加入最長子串的前字元
			int strTempEnd = i + 1;//待加入最長子串的後字元
			while (strTempBegin >= 0 && strTempEnd < length &&
				str[strTempBegin] == str[strTempEnd]) {
				//如果待加入子串的前後字元下標合法,且兩端的字元相等
				--strTempBegin;//前指標前移
				++strTempEnd;//後指標後移
				tempMax += 2;//迴文子串的長度自增2
			}
			if (tempMax > max) {
				//更新最長迴文子串的長度,和其對應的起始下標
				max = tempMax;
				maxBegin = strTempBegin + 1;
			}
			if (i < length - 1 && str[i] == str[i + 1]) {
				//如果當前中心字元與其後一個字元相等,那麼就尋找以i和i-1為雙中心的最長子串
				tempMax = 2;//因為是雙中心,所以初始化長度為2
				strTempBegin = i - 1;//待加入最長子串的前字元
				strTempEnd = i + 2;//待加入最長子串的後字元
				while (strTempBegin >= 0 && strTempEnd < length &&
					str[strTempBegin] == str[strTempEnd]) {
					//如果待加入子串的前後字元下標合法,且兩端的字元相等
					--strTempBegin;//前指標前移
					++strTempEnd;//後指標後移
					tempMax += 2;//迴文子串的長度自增2
				}
				if (tempMax > max) {
					//更新最長迴文子串的長度,和其對應的起始下標
					max = tempMax;
					maxBegin = strTempBegin + 1;
				}
			}
		}
        //在原子串中切出最長迴文子串
		string longestSubStr = string(str, maxBegin, max);
        return longestSubStr;
    }

以下是演算法思路的示意圖:
在這裡插入圖片描述在這裡插入圖片描述