336.palindrome-pairs.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. func palindromePairs(words []string) (res [][]int) {
  2. m := make(map[string]int)
  3. n := len(words)
  4. for i := 0; i < n; i++ {
  5. k := len(words[i])
  6. runes := make([]rune, k)
  7. for _, r := range words[i] {
  8. k--
  9. runes[k] = r
  10. }
  11. m[string(runes)] = i
  12. }
  13. for i := 0; i < n; i++ {
  14. if idx, ok := m[""]; ok && idx != i && isPalindrome(words[i]) {
  15. res = append(res, []int{idx, i}) // Empty string and palindrome
  16. res = append(res, []int{i, idx})
  17. }
  18. if idx, ok := m[words[i]]; ok && idx != i {
  19. res = append(res, []int{idx, i}) // Whole string and its reverse
  20. }
  21. k := len(words[i])
  22. for j := 1; j < k; j++ {
  23. wl, wr := words[i][:j], words[i][j:]
  24. if idx, ok := m[wr]; ok && isPalindrome(wl) { // wr' + wl + wr
  25. res = append(res, []int{idx, i})
  26. }
  27. if idx, ok := m[wl]; ok && isPalindrome(wr) { // wl + wr + wl'
  28. res = append(res, []int{i, idx})
  29. }
  30. }
  31. }
  32. return
  33. }
  34. func isPalindrome(s string) bool {
  35. n := len(s)
  36. for l, r := 0, n-1; l < r; l, r = l+1, r-1 {
  37. if s[l] != s[r] {
  38. return false
  39. }
  40. }
  41. return true
  42. }
  43. func palindromePairsOn3(words []string) (res [][]int) { // Brute search, O(n^3)
  44. n := len(words)
  45. for i := 0; i < n-1; i++ {
  46. for j := i + 1; j < n; j++ {
  47. b1, b2 := isPalindromePair(words[i], words[j])
  48. if b1 {
  49. res = append(res, []int{i, j})
  50. }
  51. if b2 {
  52. res = append(res, []int{j, i})
  53. }
  54. }
  55. }
  56. return
  57. }
  58. func isPalindromePair(s1, s2 string) (bool, bool) {
  59. s12, s21 := s1+s2, s2+s1
  60. n := len(s12)
  61. b1, b2 := true, true
  62. for l, r := 0, n-1; l < r && (b1 || b2); l, r = l+1, r-1 {
  63. if s12[l] != s12[r] {
  64. b1 = false
  65. }
  66. if s21[l] != s21[r] {
  67. b2 = false
  68. }
  69. }
  70. return b1, b2
  71. }