LeetCode程式設計題:最長迴文子串
阿新 • • 發佈:2019-01-10
給定一個字串 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; }
以下是演算法思路的示意圖: