给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。

    返回 s 所有可能的分割方案。

    示例:

    输入: “aab”
    输出:
    [
    [“aa”,”b”],
    [“a”,”a”,”b”]
    ]

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/palindrome-partitioning

    思路:
    使用dp保存每个子串是否为回文串,然后使用回溯
    dp转移过程须注意

    • ii + 1关联,i循环要倒序(先推作为已知,再推
    • jj - 1关联,j循环要顺序(先推作为已知,再推
      1. var partition = function (s) {
      2. let ans = [];
      3. const dfs = (start, path) => {
      4. if (start === s.length) {
      5. ans.push([...path]);
      6. return;
      7. }
      8. for (let i = start; i < s.length; i++) {
      9. if (!dp[start][i]) {
      10. continue;
      11. }
      12. path.push(s.slice(start, i + 1));
      13. dfs(i + 1, path);
      14. path.pop();
      15. }
      16. };
      17. let n = s.length;
      18. let dp = new Array(n).fill(undefined).map(() => {
      19. return new Array(n).fill(false);
      20. });
      21. for (let i = n - 1; i >= 0; i--) {
      22. for (let j = i; j < n; j++) {
      23. if (s[i] === s[j] && (j - i <= 1 || dp[i + 1][j - 1])) {
      24. dp[i][j] = true;
      25. }
      26. }
      27. }
      28. dfs(0, []);
      29. return ans;
      30. };