题意:

image.png

思路:

未命名文件 (62).png

  1. s****start** i
  2. aab****0*****0 a
  3. aab****1*****1 a
  4. aab****2*****2 b
  5. aab****1*****2
  6. aab****0*****1 aa
  7. aab****2*****2 b
  8. aab****0*****2

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param String $s
  4. * @return String[][]
  5. */
  6. public $res = [];
  7. function partition($s) {
  8. $this->do($s, 0, []);
  9. return $this->res;
  10. }
  11. function do($s, $start, $array) {
  12. //递归出口,空字符串
  13. if ($start == strlen($s)) {
  14. $this->res[] = $array;
  15. return;
  16. }
  17. for ($i = $start; $i < strlen($s); $i++) {
  18. if (!$this->isPalindrome($s, $start, $i)) continue;
  19. array_push($array, substr($s, $start, $i - $start + 1));
  20. $this->do($s, $i + 1, $array);
  21. array_pop($array);
  22. }
  23. }
  24. function isPalindrome($s, $start, $end) {
  25. while ($start < $end) {
  26. if ($s[$start] != $s[$end]) return false;
  27. ++$start;
  28. --$end;
  29. }
  30. return true;
  31. }
  32. }

GO代码实现:

  1. func partition(s string) [][]string {
  2. array := [][]string{}
  3. res := []string{}
  4. dfs(s, 0, res, &array)
  5. return array
  6. }
  7. func dfs(s string, start int, res []string, array *[][]string) {
  8. if start == len(s) {
  9. tmp := make([]string, len(res))
  10. copy(tmp, res)
  11. *array = append(*array, tmp)
  12. return
  13. }
  14. for i := start; i < len(s); i++ {
  15. // start-i之间不是回文时continue
  16. if !isPal(s, start, i) {
  17. continue
  18. }
  19. res = append(res, string(s[start:i+1]))
  20. dfs(s, i+1, res, array)
  21. res = res[:len(res)-1]
  22. }
  23. }
  24. func isPal(s string, l, r int) bool {
  25. for l < r {
  26. if s[l] != s[r] {
  27. return false
  28. }
  29. l, r = l+1, r-1
  30. }
  31. return true
  32. }