给你一个字符串 s
,请你将 s
分割成一些子串,使每个子串都是
回文串
。返回 s
所有可能的分割方案。
示例 1:
输入:s = "aab" 输出:[["a","a","b"],["aa","b"]]
示例 2:
输入:s = "a" 输出:[["a"]]
提示:
1 <= s.length <= 16
s
仅由小写英文字母组成
思路: 思路就是递归来保得到一个结果,循环+递归来保证获得一个结果集,由于要有多个结果,肯定会有分支,类似于树的深度优先遍历,需要回溯,最后提交结果时,面对集合这种引用类型的数据,需要使用深拷贝,new ArrayList(List list) 该构造函数已实现。
class Solution {
List<List<String>> result = new ArrayList<>();
public List<List<String>> partition(String s) {
// 本题100%是需要遍历的,双指针,当尾指针遍历到不属于回文串时,也应该继续遍历,直到到字符串的末尾比如aab不属于字符串但后面可能是aabbaa
// 面对不同分支则使用递归+回溯+深拷贝解决
bulid(s, new ArrayList(), 0);
return result;
}
public void bulid(String s, List<String> list, int start) {
if (start == s.length()) {
result.add(new ArrayList<>(list));
return;
}
for(int i = start; i < s.length(); i++) {
if(isHui(s, start, i)) {
list.add(s.substring(start, i + 1));
bulid(s, list, i + 1);
// 回溯操作 分支操作
list.remove(list.size()-1);
}
}
}
public boolean isHui(String s, int left, int right) {
if(left > right) return false;
while (left < right) {
// 如果左右字符不相等,则不是回文
if (s.charAt(left) != s.charAt(right)) {
return false;
}
// 移动指针
left++;
right--;
}
// 如果循环结束都没有返回false,则是回文
return true;
}
}