【算法笔记】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;
    }
}
相关推荐
花火|13 分钟前
算法训练营day62 图论⑪ Floyd 算法精讲、A star算法、最短路算法总结篇
算法·图论
GuGu202421 分钟前
新手刷题对内存结构与形象理解的冲突困惑
算法
汤永红23 分钟前
week4-[二维数组]平面上的点
c++·算法·平面·信睡奥赛
晴空闲雲40 分钟前
数据结构与算法-字符串、数组和广义表(String Array List)
数据结构·算法
hello_ world.2 小时前
k8s笔记04-常用部署命令
笔记·容器·kubernetes
SatoshiGogo2 小时前
《李沐读论文》系列笔记:论文读写与研究方法【更新中】
笔记
IT19952 小时前
Wireshark笔记-DHCP流程与数据包解析
笔记·测试工具·wireshark
子朔不言2 小时前
[MH22D3开发笔记]2. SPI,QSPI速度究竟能跑多快,双屏系统的理想选择
笔记·mh22d3·新龙微·兆讯·双屏
被遗忘的旋律.2 小时前
Linux驱动开发笔记(七)——并发与竞争(上)——原子操作
linux·驱动开发·笔记
颜如玉2 小时前
位运算技巧总结
后端·算法·性能优化