131.go 860 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. package main
  2. func partition(s string) [][]string {
  3. length := len(s)
  4. lists := [][]string{}
  5. list := []string{}
  6. partitionHelper(&lists, &list, s, 0, length)
  7. return lists
  8. }
  9. // Backtracking algorithm, try to understand & remember
  10. func partitionHelper(lists *[][]string, list *[]string, s string, beg, end int) {
  11. if beg == end {
  12. newList := make([]string, len(*list))
  13. copy(newList, *list)
  14. *lists = append(*lists, newList)
  15. return
  16. }
  17. for i := beg + 1; i <= end; i++ {
  18. if isPalindrome(s, beg, i) {
  19. *list = append(*list, s[beg:i])
  20. partitionHelper(lists, list, s, i, end)
  21. *list = (*list)[:len(*list)-1] // Backtrack
  22. }
  23. }
  24. }
  25. func isPalindrome(s string, beg, end int) bool {
  26. for ; beg < end-1; beg, end = beg+1, end-1 {
  27. if s[beg] != s[end-1] {
  28. return false
  29. }
  30. }
  31. return true
  32. }
  33. // func main() {
  34. // fmt.Println(partition("aabbb"))
  35. // }