# 0131. 分割回文串 ###### tags: `Leetcode` `Medium` `回溯` ## 思路 ## Code ```c= ``` ## Result ## Code in Java ```java= class Solution { public List<List<String>> partition(String s) { int len = s.length(); List<List<String>> res = new ArrayList<>(); if (len == 0) { return res; } // Stack 这个类 Java 的文档里推荐写成 Deque<Integer> stack = new ArrayDeque<Integer>(); // 注意:只使用 stack 相关的接口 Deque<String> stack = new ArrayDeque<>(); char[] charrArray = s.toCharArray(); dfs(charrArray, 0, len, stack, res); return res; } /** * @param charArray * @param index 起始字符的索引 * @param len 字符串 s 的长度,可以设置为全局变量 * @param path 记录从根结点到叶子结点的路径 * @param res 记录所有的结果 */ private void dfs(char[] charArray, int index, int len, Deque<String> path, List<List<String>> res) { if (index == len) { res.add(new ArrayList<>(path)); return; } for (int i = index; i < len; i++) { // 因为截取字符串是消耗性能的,因此,采用传子串下标的方式判断一个子串是否是回文子串 if (!checkPalindrome(charArray, index, i)) { continue; } path.addLast(new String(charArray, index, i + 1 - index)); dfs(charArray, i + 1, len, path, res); path.removeLast(); } } /** * 这一步的时间复杂度是 O(N),优化的解法是,先采用动态规划,把回文子串的结果记录在一个表格里 * * @param charArray * @param left 子串的左边界,可以取到 * @param right 子串的右边界,可以取到 * @return */ private boolean checkPalindrome(char[] charArray, int left, int right) { while (left < right) { if (charArray[left] != charArray[right]) { return false; } left++; right--; } return true; } } ``` ## 思路 这题就有意思了,需要用到回溯,回溯又需要递归实现。 详细见以下链接,一图胜千言。 https://leetcode-cn.com/problems/combination-sum/solution/hui-su-suan-fa-jian-zhi-python-dai-ma-java-dai-m-2/ 类似题目:39 ## Result 执行用时:3 ms, 在所有 Java 提交中击败了77.36%的用户 内存消耗:38.5 MB, 在所有 Java 提交中击败了86.25%的用户