gopherRiz/manachers_algorith_longest_...

48 lines
723 B
Go

package gopherriz
func longestPalindrome(s string) string {
transformed := "#"
for _, letter := range s {
transformed += string(letter) + "#"
}
n := len(transformed)
p := make([]int, n)
c, r := 0, 0
mirror := 0
for i := 0; i < n; i++ {
mirror = c*2 - i
if i < r {
p[i] = min(r-i, p[mirror])
}
for i+p[i]+1 < n && i-p[i]-1 >= 0 && transformed[i+p[i]+1] == transformed[i-p[i]-1] {
p[i] += 1
}
if i+p[i] > r {
c = i
r = c + p[c]
}
}
maxLength, centre := 0, 0
for i, v := range p {
if v > maxLength {
maxLength = v
centre = i
}
}
start := (centre - maxLength) / 2
return s[start : start+maxLength]
}
func min(a int, b int) int {
if a < b {
return a
}
return b
}