分割回文串
给你一个字符串 s
,请你将 s
分割成一些子串,使每个子串都是
回文串
。返回 s
所有可能的分割方案。
示例 1:
1 2
| 输入:s = "aab" 输出:[["a","a","b"],["aa","b"]]
|
示例 2:
提示:
1 <= s.length <= 16
s
仅由小写英文字母组成
假设s
中每两个字母中间有一个逗号,逗号有选和不选两种情况,i
代表字母s[i]
和s[i+1]
之间的逗号,选了逗号就代表从逗号处分开。
对于每个i
有选和不选两种情况,选就代表截取,将start
到i
加到路径。 所以只有是回文字串才能. 最后一个逗号必须选因为遍历到最后必须要加入list
.
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
| class Solution { private List<List<String>> res = new ArrayList<>(); private List<String> list = new ArrayList<>(); private String s;
public List<List<String>> partition(String s) { this.s = s; dfs(0, 0); return res; }
private void dfs(int i, int start) { if (i == s.length()) { res.add(new ArrayList<>(list)); return; }
if (i < s.length() - 1) { dfs(i + 1, start); } if (check(start, i)) { list.add(s.substring(start, i + 1)); dfs(i + 1, i + 1); list.remove(list.size() - 1); } }
private boolean check(int start, int end) { while (start < end) { if (s.charAt(start) != s.charAt(end)) { return false; } start++; end--; } return true; } }
|