回溯

分割回文串

中等#131Java时间 O(n²·2ⁿ),朴素回文检查的保守上界空间 O(n),不计结果

题目要做什么

将字符串切分成若干连续子串,每段都是回文,返回全部切分方案。

题目示例输入s = "aab"
题目示例输出[["a","a","b"],["aa","b"]]

01 为什么这样做

从 start 枚举下一段的终点。只有回文段才加入路径并继续切剩余后缀;后缀完成后撤销这一段,探索其他切点。

始终成立的条件

path 中所有段均为回文,拼接后恰好等于 s 的已处理前缀。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public List<List<String>> partition(String s) {3        List<List<String>> result = new ArrayList<>();4        search(s, 0, new ArrayList<>(), result);5        return result;6    }7    private void search(String s, int start, List<String> path, List<List<String>> result) {8        if (start == s.length()) {9            result.add(new ArrayList<>(path));10            return;11        }12        for (int end = start; end < s.length(); end++) {13            if (!palindrome(s, start, end)) continue;14            path.add(s.substring(start, end + 1));15            search(s, end + 1, path, result);16            path.remove(path.size() - 1);17        }18    }19    private boolean palindrome(String s, int left, int right) {20        while (left < right) {21            if (s.charAt(left++) != s.charAt(right--)) return false;22        }23        return true;24    }25}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索