214.shortest-palindrome.go 608 B

123456789101112131415161718192021222324252627282930313233
  1. import (
  2. "strings"
  3. )
  4. func shortestPalindrome(s string) string {
  5. l := len(s)
  6. if l <= 1 {
  7. return s
  8. }
  9. var i, j int
  10. for i = l; i <= 2*l; i++ { // i means the length of the shortest palindrome
  11. if i%2 == 1 { // Odd
  12. for j = 1; 0 <= l-1-i/2-j && s[l-1-i/2-j] == s[l-1-i/2+j]; j++ {
  13. }
  14. if l-1-i/2-j < 0 {
  15. break
  16. }
  17. } else { // Even
  18. for j = 1; 0 <= l-i/2-j && s[l-i/2-j] == s[l-1-i/2+j]; j++ {
  19. }
  20. if l-i/2-j < 0 {
  21. break
  22. }
  23. }
  24. }
  25. idx := l - 1 - i/2 + j
  26. var ans strings.Builder
  27. for i := l-1; idx <= i; i-- {
  28. ans.WriteByte(s[i])
  29. }
  30. ans.WriteString(s)
  31. return ans.String()
  32. }