分割回文串
关键点:
- 递归如何终止:当startIndex == s.length() (注意没有-1是因为这一步操作不会继续进行)
- 在递归循环中如何截取子串:关键在于在每个栈都创建属于自己的StringBuffer(!!!很关键,这样就不会在每次换栈的时候手动删除sb),在自己的基础上append即可。
- 如何判断回文:类似数组中的左右指针
- !!!只有在字符串判断为回文串时才进行递归
/**end其实是不变,虽然每层循环个数不一样,但是每层循环的其实位置也不一样 */
class Solution {List<List<String>> res = new ArrayList<>();List<String> sub = new ArrayList<>();public List<List<String>> partition(String s) {StringBuffer sb = new StringBuffer();fucPartition(s, 0, sb);return res;}public void fucPartition(String s, int startIndex, StringBuffer sb){ //每个里边有自己的sb// 递归终止条件if(startIndex == s.length() ){res.add(new ArrayList<>(sub));return;}for(int i = startIndex; i < s.length(); i++){//截取字串sb.append(s.charAt(i));// 判断是否位回文串if(isTrue(sb)){sub.add(sb.toString()); // 这个别忘了fucPartition(s, i + 1, new StringBuffer()); //创建新的sbsub.remove(sub.size() - 1);//sub.remove(sub.size() - 1); }else{ //如果不是说明分割方式错误continue; // 不再往下进行}}}//判断字符串是不是回文public boolean isTrue(StringBuffer sb){int left = 0;int right = sb.length() - 1;while(left < right){if(sb.charAt(left) == sb.charAt(right)){left++;right--;}else{return false;}}return true;}
}
写博客的目的是每日督促并记录刷题,也欢迎大家批评指正~(day26)(呜呜隔了好多天了,后边要更加油!!)