61.分割回文串

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

示例1:

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

示例2:

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

提示:

  • 1 <= s.length <= 16
  • s 仅由小写英文字母组成

代码:

class Solution {
    public List<List<String>> partition(String s) {
        //res用于存储所有分割方案
        List<List<String>> res = new ArrayList<>();
        //从索引0开始深度优先搜索
        dfs(s,0,new ArrayList<>(),res);
        //返回res
        return res;
    }
    //s为原始字符串,start为当前处理的起始索引,path为已分割的回文子串列表,res为结果集
    public void dfs(String s,int start,List<String>path,List<List<String>>res){
        //终止条件:已处理完整个字符串
        if(start == s.length()){
            //添加当前分割方案到结果集
            res.add(new ArrayList<>(path));
            //直接返回
            return;
        }
        //尝试所有可能的分割点
        for(int end = start+1;end<=s.length();end++){
            //截取子串
            String subString = s.substring(start,end);
            // 判断是否为回文
            if(judge(subString)){
                //选择当前回文子串
                path.add(subString);
                //递归处理剩余字符串
                dfs(s,end,path,res);
                //回溯:移除最后添加的子串
                path.removeLast();
            }
        }
    }
    //判断字符串是否为回文
    public boolean judge(String s){
        for(int i = 0,j = s.length()-1;i<j;i++,j--){
            //发现不对称字符,直接返回false
            if(s.charAt(i)!=s.charAt(j))return false;
        }
        //否则返回true
        return true;
    }
}
posted @ 2025-05-04 09:57  回忆、少年  阅读(27)  评论(0)    收藏  举报