【算法刷题 | 回溯思想 04】4.15(分割回文串)

文章目录

7.分割回文串

7.1题目

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。

  • 示例一:

    输入:s = "aab"
    输出:[["a","a","b"],["aa","b"]]

  • 示例二:

    输入:s = "a"
    输出:[["a"]]

7.2解法:回溯

7.2.1回溯思路

例如对于字符串abcdef:

  • 组合问题:选取一个a之后,在bcdef中再去选取第二个,选取b之后在cdef中再选取第三个...。
  • 切割问题:切割一个a之后,在bcdef中再去切割第二段,切割b之后在cdef中再切割第三段...。
(1)函数返回值以及参数
java 复制代码
private void backing(String s,int startIndex)
(2)终止条件
  • 若要切割的位置已经超出数组范围,则添加该路径下的回文串

  • res:全部符合条件的回文串组合

  • paths:当前分割路径的回文串组合

java 复制代码
if(startIndex > s.length()-1){
	res.add(new ArrayList(paths));
}
(3)遍历过程
java 复制代码
for(int i=startIndex;i<s.length();i++){
	//判断当前段是否为回文
    if(isPalindrome(s,startIndex,i)){
        
        //获取 [startIndex,i]的子串
        String str=s.substring(startIndex,i+1);
        paths.add(str);
    }else{
        continue;
    }
    
    backing(s,i+1);
    
    //回溯
    paths.remove(paths.size()-1);
}
  • 判断是否为回文串方法:
java 复制代码
private boolean isPalindrome(String s,int start,int end){
	for(;start<end;start++,end--){
        if(s.charAt(start)!=s.charAt(end)){
            return false;
        }
    }
    return true;
}

7.2.2代码

java 复制代码
	List<List<String>> res=new ArrayList<>();
    List<String> paths=new ArrayList<>();

    public List<List<String>> partition(String s) {
        backing(s,0);
        return res;
    }

    private void backing(String s,int startIndex){
        if(startIndex>s.length()-1){
	        res.add(new ArrayList(paths));
            return;
        }  

        for(int i=startIndex;i<s.length();i++){
	        //判断当前段是否为回文
            if(isPalindrome(s,startIndex,i)){
        
                //获取 [startIndex,i]的子串
                String str=s.substring(startIndex,i+1);
                paths.add(str);
            }else{
                continue;
            }
    
            backing(s,i+1);
    
            //回溯
            paths.remove(paths.size()-1);
        }      
    }

    private boolean isPalindrome(String s,int start,int end){
	    for(;start<end;start++,end--){
            if(s.charAt(start)!=s.charAt(end)){
                return false;
            }
        }
        return true;
    }
相关推荐
zwhdlb2 分钟前
Java + 工业物联网 / 智慧楼宇 面试问答模板
java·物联网·面试
刘一说18 分钟前
CentOS 系统 Java 开发测试环境搭建手册
java·linux·运维·服务器·centos
卷福同学24 分钟前
来上海三个月,我在马路边上遇到了阿里前同事...
java·后端
野渡拾光1 小时前
【考研408数据结构-05】 串与KMP算法:模式匹配的艺术
数据结构·考研·算法
bingbingyihao2 小时前
多数据源 Demo
java·springboot
tainshuai3 小时前
用 KNN 算法解锁分类的奥秘:从电影类型到鸢尾花开
算法·分类·数据挖掘
在努力的前端小白7 小时前
Spring Boot 敏感词过滤组件实现:基于DFA算法的高效敏感词检测与替换
java·数据库·spring boot·文本处理·敏感词过滤·dfa算法·组件开发
Coovally AI模型快速验证9 小时前
农田扫描提速37%!基于检测置信度的无人机“智能抽查”路径规划,Coovally一键加速模型落地
深度学习·算法·yolo·计算机视觉·transformer·无人机
pusue_the_sun9 小时前
数据结构:二叉树oj练习
c语言·数据结构·算法·二叉树
一叶飘零_sweeeet10 小时前
从繁琐到优雅:Java Lambda 表达式全解析与实战指南
java·lambda·java8