131. 分割回文串

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
太难了 下一题吧

输入:s = “aab”
输出:[[“a”,”a”,”b”],[“aa”,”b”]]
image.png

  1. //回溯+ dp
  2. func partition(s string) (ans [][]string) {
  3. n := len(s)
  4. f := make([][]bool, n)
  5. for i := range f {
  6. f[i] = make([]bool, n)
  7. for j := range f[i] {
  8. f[i][j] = true
  9. }
  10. }
  11. for i := n - 1; i >= 0; i-- {
  12. for j := i + 1; j < n; j++ {
  13. f[i][j] = s[i] == s[j] && f[i+1][j-1]
  14. }
  15. }
  16. splits := []string{}
  17. var dfs func(int)
  18. dfs = func(i int) {
  19. if i == n {
  20. ans = append(ans, append([]string(nil), splits...))
  21. return
  22. }
  23. for j := i; j < n; j++ {
  24. if f[i][j] {
  25. splits = append(splits, s[i:j+1])
  26. dfs(j + 1)
  27. splits = splits[:len(splits)-1]
  28. }
  29. }
  30. }
  31. dfs(0)
  32. return
  33. }