
/**
将字符串分割为若干回文子串;回文子串: 单个字符、正序倒序一样。
大致执行流程(for循环 + 递归):
首先从i = 0开始,从第一个元素处开始切割,判断是否是回文子串
若是则保存到tempRes中,并从i + 1处开始重复上述流程从第一个元素开始切割,直到切割到最后一个元素保存结果
若不是则迭代i,从下一个元素处开始尝试切割
.......
回溯:
回溯index(起始点),迭代i(切割点),重复上述流程直到切割到最后一个元素
继续回溯index,直到最初始的for循环执行完毕切割到最后一个元素,执行完毕得到所有结果
*/
class Solution {
//保存所有结果
private List<List<String>> res = new ArrayList<>();
//保存单次临时结果
private List<String> tempResult = new ArrayList<>();
//避免重复传参
private String s;
public List<List<String>> partition(String s) {
/**
将字符串分割为若干回文子串;回文子串: 单个字符、正序倒序一样。
大致执行流程(for循环 + 递归):
首先从i = 0开始,从第一个元素处开始切割,判断是否是回文子串
若是则保存到tempRes中,并从i + 1处开始重复上述流程从第一个元素开始切割,直到切割到最后一个元素保存结果
若不是则迭代i,从下一个元素处开始尝试切割
.......
回溯:
回溯index(起始点),迭代i(切割点),重复上述流程直到切割到最后一个元素
继续回溯index,直到最初始的for循环执行完毕切割到最后一个元素,执行完毕得到所有结果
*/
this.s = s;
backtrack(0);
return res;
}
private void backtrack(int index) {
//回文子串合法性判断在单层搜索逻辑中
if(index == s.length()) {
res.add(new ArrayList<>(tempResult));
return;
}
for(int i = index; i < s.length(); i++) {
//当前切割出的子串是回文子串则保存在temp中,并迭代起点继续切割
if(isHW(index,i)) {
tempResult.add(s.substring(index,i + 1)); //substring(start,end)-->[start,end)
//从i + 1开始继续切割
backtrack(i + 1);
//回溯
tempResult.remove(tempResult.size() - 1);
}
}
}
//回文子串的判断
private boolean isHW(int start, int end) {
while(start < end) {
if(s.charAt(start) != s.charAt(end)) {
return false;
}
start++;
end--;
}
return true;
}
}
142

被折叠的 条评论
为什么被折叠?



