leetcode演算法題—golang—最長迴文子串(題5)
阿新 • • 發佈:2018-11-11
題目:最長迴文子串
給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為1000。
示例 1:
輸入: "babad" 輸出: "bab" 注意: "aba"也是一個有效答案。
示例 2:
輸入: "cbbd" 輸出: "bb"
方法一 時間複雜度O(n^3)
func longestPalindrome(s string) string { if strings.TrimSpace(s) == ""{ return "" } sLen := len(s)//babad maxStr :=string(s[0]) maxStrLen :=0 for i:=0;i<sLen;i++{ //str := "babadada" //輸出的結果應該為:"adada" location := strings.IndexByte(s[i:],s[i]) location +=i for location!=-1{ //比較是否是迴文數 temp := string(s[i:location+1]) if temp== reverceString(temp) && len(temp) >=maxStrLen{ maxStrLen = len(temp) maxStr = temp } location++ //下次找的起點位置 if i := strings.IndexByte(string(s[location:]),s[i]);i==-1{ location =-1 }else{ location +=i } } } return maxStr } func reverceString(str string)string{ bs := []byte(str) //分開寫,看這更清楚 from,to := 0,len(bs)-1 for from <to{ bs[from],bs[to] = bs[to],bs[from] from++ to-- } return string(bs) }
方法二 時間複雜度O(n^2)
//中心擴充套件演算法,可以在n*n之間完成 func longestPalindrome2(s string) string { //babad bab if strings.TrimSpace(s) =="" || len(s) <1 { return "" } start,end := 0,0 for i:=0;i<len(s);i++{ len1 :=expandAroundCenter(s,i,i) //a [b] a bd 可能迴文數的中間數是一個 則從一個數開始兩邊擴散 len2 := expandAroundCenter(s,i,i+1)//a [bb] c 可能迴文數的中間數可以使兩個。從兩個開始兩邊是擴散 len := int(math.Max(float64(len1),float64(len2))) //比較出兩個的最長的長度 if len > end-start{ //len=3 i=1 start =i-(len-1)/2 //i:在這裡就是一個迴文數的中間數,(len-1):是處理len可能是偶數的情況 end = i+len/2 } } return string(s[start:end+1]) } ////babad bab func expandAroundCenter(s string,left,right int)int{ L,R := left,right for L>=0 && R <len(s) && s[L] ==s[R]{ L-- R++ } return R-L-1 //計算出該串的長度 }
推薦 方法二