演算法 求解最大回文子字串

2021-08-22 02:17:27 字數 1487 閱讀 1093

第一種方法:暴力求解,時間複雜度o(n^3)

兩個巢狀迴圈遍歷字串中的所有子字串,另乙個迴圈用來判斷當前子字串是否為回文。

func longestpalindromicstring_on3(s string) string 

}if ispalindromic == true

}} }

return str

}

第二種方法:採用對於字串中常用start/end或者是low/high前後遍曆法。時間複雜度為o(n^2)

將子字串的長度分為單數和雙數,分別進行不同的賦值。

遍歷0:len(s)-1,如果是單數,low=high=index;如果是雙數:low=index, high= index+1

func longestpalindromicstring_on2(s string) string  else if len(str2) > len(str1) && length < len(str2) 

} return str

}func search_on2(s string, low, high int) string

return s[low+1 : high]

}

第三種方法:manacher演算法

重在理解構造陣列length,length[i]是以當前位置為中心,周圍回文字串半徑。

演算法首先將字串都變成單數。即向中間以及首末插入類似#符號。則cbbd變成#c#b#b#d#

其中使用到兩個變數,sub_mid是在i之前最長回文子字串的中心,sub_side是length(sub_mid) + sub_mid-1,也就是最長回文子字串的最右端點。初始值均置0。

每次遍歷時判斷當前i與sub_side的關係,若是小於sub_side,則i在最大回文子字串裡,根據sub_mid尋找到其對稱的點,將對稱點的length陣列的值作為length[i]的值。否則前後遍歷字串計算其length值。每次迴圈都更新sub_mid和sub_side。

上述cbbd字串對應的length陣列為[1,2,1,2,3,2,1,2,1]。

func longestpalindromicstring_on(s string) string 

var length int = make(int, len(str))

sub_mid, sub_side := 0, 0

maxlength, index := 0, 0

for i := 0; i < len(str); i++ else

} else

} if length[i]+i-1 > sub_side

if maxlength < length[i]

} return s[(index-length[index]+1)/2 : (index+length[index])/2]

}

求最大回文子字串

題目出處 回文字串 簡單點說就是字串反轉 reverse 後的結果還是自己。如 abcba abccba 返轉後的結果是一樣的。最簡單的回文字串是空字串及長度為1的字串。題目要求,給乙個字元,可以假設最大長度的1000.查詢最大回文子字串。並返回乙個。解決方法 遍歷字串 假設當前位置就做為回文字串的...

最長回文子字串演算法

def is palindrome s if len s 1 return true else return s 0 s 1 and is palindrome s 1 1 眾所周知,寫遞迴的函式,需要 1 個基本情況,作為終止。還需要 1 個遞迴情況。關於回文字串的判斷,基本情況是,為 1 個字元...

最長回文串 演算法 4 求解最長回文子串

問題描述 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。注釋 回文通俗的說就是正著念和反著念都一樣,如 上海自來水來自海上。示例 1 輸入 dabccbac 輸出 abccba 示例 2 輸入 cbbd 輸出 bb 解題思路 此處撰寫解題思路 遍歷每乙個索引,...