https://leetcode.cn/problems/palindrome-partitioning/
思路:
先思考暴力算法能否可行?
很明显是不行的,以aab为例,需要一个一个遍历
首先需要遍历aab,例如先遍历到a,判断a是回文数,然后剩下ab
需要对ab进行遍历、判断a或者ab是否是回文数
首先判断ab不是,然后a|a|是回文数
之后还需要对剩下的b进行判断,判断b是否是回文数
相当于需要3层遍历,所以得使用回溯算法
回溯思路:
1、首先是横线切割,使用for进行遍历即可,相当于第一层,对a,a,b一个一个进行切割
2、纵向遍历,使用的是递归,记住递归的方式,相当于自己调自己,然后切割从下一个开始,以先切割a为方式,相当于需要对ab进行切割
3、确认什么是回文数?如果是回文数,且切割到最后一个数据的时候,则可以将数据放入结果了
使用队列进行数据的短暂存放 Deque
/**
* 131. 分割回文串
*/
//用于存放最终结果
private List<List<String>> res131=new ArrayList<>();
//队列 存放遍历的数据
private Deque<String> path131=new ArrayDeque<>();
public List<List<String>> q131(String s) {
bt131(s,0);
return res131;
}
//
private void bt131(String s,Integer index){
//如果切割的下标>=数组的长度的时候,则证明是最后一个数据
//就可以将起加入数组中了
if(index>=s.length()){
res131.add(new ArrayList<>(path131));
return;
}
//横向遍历
for (int i = index; i <s.length() ; i++) {
if(isHuiwen(s,index,i)){
path131.addLast(s.substring(index,i+1));
}else{
continue;
}
//纵向遍历,对当前i之后的数据进行切割
bt131(s,i+1);
//需要将队列中的最后一个移除
path131.removeLast();
}
}
//回文数:双指针
private boolean isHuiwen(String s, Integer start, Integer end){
for (int i = start,j=end; i < j ; i++,j--) {
if(s.charAt(i)!=s.charAt(j)) {
return false;
}
}
return true;
}
写的还不是很好,需要继续学习如何更好的表述!