分割回文串力扣--131
目录
题目
思路
代码
题目
给你一个字符串 s
,请你将 s
分割成一些子串,使每个子串都是 回文串,返回 s
所有可能的分割方案。
示例 1:
入:s = "aab" 输出:[["a","a","b"],["aa","b"]]
示例 2:
输入:s = "a" 输出:[["a"]]
提示:
1 <= s.length <= 16
s
仅由小写英文字母组成
思路
首先第一个难点是把回文和回溯算法联系在一起
例如对于字符串abcdef:
- 组合问题:选取一个a之后,在bcdef中再去选取第二个,选取b之后在cdef中再选取第三个.....。
- 切割问题:切割一个a之后,在bcdef中再去切割第二段,切割b之后在cdef中再切割第三段.....。
递归函数参数还需要startIndex,因为切割过的地方,不能重复切割,和组合问题也是保持一致的。
从树形结构的图中可以看出:切割线切到了字符串最后面,说明找到了一种切割方法,此时就是本层递归的终止条件。
在for (int i = startIndex; i < s.length(); i++)
循环中,我们 定义了起始位置startIndex,那么 [startIndex, i] 就是要截取的子串。
首先判断这个子串是不是回文,如果是回文,就加入在path
中,path用来记录切割过的回文子串。
切割过的位置,不能重复切割,所以,backtracking(s, i + 1); 传入下一层的起始位置为i + 1。
代码
class Solution {
List<List<String>> result=new ArrayList<>();
//最后结果集
List<String> path=new ArrayList<>();
public List<List<String>> partition(String s) {
backTracking(s,0,new StringBuilder());
return result;
}
public void backTracking(String s,int startIndex,StringBuilder sb){
if(startIndex==s.length()){
//因为是起始位置一个一个加的,所以结束时start一定等于s.length,因为进入backtracking时一定末尾也是回文,所以cur是满足条件的
result.add(new ArrayList<>(path));
return;
}
for(int i=startIndex;i<s.length();i++){
sb.append(s.charAt(i));
if(check(sb)){
path.add(sb.toString());
backTracking(s, i + 1, new StringBuilder());
path.remove(path.size() -1);
}
}
}
public boolean check(StringBuilder sb){//判断回文
for (int i = 0; i < sb.length()/ 2; i++){
if (sb.charAt(i) != sb.charAt(sb.length() - 1 - i)){return false;}
}
return true;
}
}