力扣:131. 分割回文串
回溯解法思路:
1.先声明一个集合来接受全部的回文子串组合,在声明一个集合来接收单个回文子串的组合。
2.写一个回溯函数,里面有终止条件和遍历全部组合的for循环来进行遍历全部的组合,终止条件为开始索引等于字符串的长度时,表示遍历完了整个字符串,li2加入到li1中去。在遍历for循环中要回溯操作,同时要检查分割段是否为回文子串,如果不是回文子串就跳过本次循环。 要写一个检查回文子串的函数,其中用双指针来检查这个分割段是否是回文子串。
class Solution {
//接收全部的回文子串
List<List<String>> li1=new ArrayList<>();
//接收单个回文子串
List<String> li2=new ArrayList<>();
public List<List<String>> partition(String s) {
//调用回溯函数
huisu(s,0);
return li1;
}
//回溯函数
public void huisu(String s,int startIndex){
//判断分割到了字符串的末尾
if(startIndex==s.length()){
li1.add(new ArrayList<>(li2));
return;
}
//暴力的遍历全部组合
for(int j=startIndex;j<s.length();j++){
//如果是回文子串,则记录
if(huiwen(s,startIndex,j)){
//进行分割的字符操作
String st = s.substring(startIndex, j+ 1);
li2.add(st);
}else {
//不是回文子串跳过这次循环
continue;
}
//调用方法进行递归。
huisu(s,j+1);
//得到回文串之后,回溯
li2.removeLast();
}
}
//回文函数
public boolean huiwen(String s,int startIndex,int j){
//遍历用双指针的方法来检查字符串是否是回文子串
while(startIndex<j){
if(s.charAt(startIndex)!=s.charAt(j)){
return false;
}
startIndex++;
j--;
}
return true;
}
}