1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| 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[] charArray = s.toCharArray(); dfs(charArray, 0, len, stack, res); return 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(); } }
private boolean checkPalindrome(char[] charArray, int left, int right) { while (left < right) { if (charArray[left] != charArray[right]) { return false; } left++; right } return true; }
|