【算法笔记】LCR 086. 分割回文串

基本思想是使用回溯法,回溯法都可以将问题划分为一个解空间树:假设字符串s为"aab",那么我们可以使用深度优先搜索去构建解空间树:

dfs遍历出来的第一个序列是a, a, b,显然该序列都是回文子串,接着回溯,遍历下一个序列,为a, ab,不是回文子串,去除...如此往下遍历,将符合要求的序列加入到结果集res中,直到遍历整个解空间树

此题的重要思想有两个:

Java中的List变量存储的是List的地址,而非List本身,因此可以构建一个path列表,用于存储当前已经遍历的序列,当dfs向下遍历的时候则将新遍历的字符串加入path中;当向上回溯的时候,可以将path中的最后一个元素remove掉,从而恢复到上一个遍历状态

java 复制代码
class Solution {
    public List<String> path = new ArrayList<>();
    public List<List<String>> result = new ArrayList();

    public void f(String str, int start){
        if (start >= str.length()){
            // 防止深复制导致的将List地址存入result,需要新建List
            result.add(new ArrayList<>(path));
        }

        for (int i = start; i < str.length(); i++) {
            if (isPalindrome(str, start, i)){
                path.add(str.substring(start, i+1));
            }
            else
                continue;
            f(str, i+1);
            path.remove(path.size()-1); // 回溯
        }
    }

    public boolean isPalindrome(String s,int start,int end){
        //start从左到右,end从右到左,判断前后是否一致
        for(int i=start,j=end;i<j;i++,j--){
            if(s.charAt(i)!=s.charAt(j)){
                return false;
            }
        }
        return true;
    }


    public String[][] partition(String s) {
        f(s, 0);
        int rows = result.size();
        String[][] ret = new String[rows][];
        for (int i = 0; i < rows; ++i) {
            int cols = result.get(i).size();
            ret[i] = new String[cols];
            for (int j = 0; j < cols; ++j) {
                ret[i][j] = result.get(i).get(j);
            }
        }
        return ret;
    }
}
相关推荐
拾饵9427 分钟前
第六周第二个项目笔记:FinInsRAG 项目学习笔记(零基础版)以及简历书写
笔记·学习
淡海水10 分钟前
02-04-原理篇-GC Roots与对象图遍历
算法·unity·c#·图·gc·遍历·roots
han688912 分钟前
selenium之实战
笔记·python·selenium·测试工具·自动化
ClickHouseDB13 分钟前
ClickHouse 大规模 OpenTelemetry 数据接入架构的可靠性演进
算法
Shaoshing20 分钟前
BHU 润石工作室 251019自建赛题解
算法
Lost_the_wind20 分钟前
MySQL 学习笔记三
笔记·学习·mysql
玩AI的奶茶39 分钟前
24GB 显存能跑多大的模型?参数量、精度与显存占用对照表
人工智能·python·算法·ai·aigc·gpu算力·算力租赁
java_nnnn1 小时前
LeetCode刷题双指针(有效三角形的个数+三数之和)Java
算法·leetcode·职场和发展
人工智能培训1 小时前
智能博弈背景下中国AI国防建设的战略价值
大数据·人工智能·算法·重构·生活
flinn_small1 小时前
三分算法:原理、实现与实战应用
数据结构·算法·三分