第一種方法:暴力求解,時間複雜度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 解題思路 此處撰寫解題思路 遍歷每乙個索引,...