48 lines
723 B
Go
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
|
|
}
|