【算法笔记】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;
    }
}
相关推荐
c#上位机8 分钟前
halcon图像增强之自动灰度拉伸
图像处理·算法·c#·halcon·图像增强
rit843249911 分钟前
压缩感知信号恢复算法:OMP与CoSaMP对比分析
数据库·人工智能·算法
Pluchon1 小时前
硅基计划4.0 算法 FloodFill算法
java·算法·leetcode·决策树·逻辑回归·深度优先·图搜索算法
菜鸟233号1 小时前
力扣347. 前k个高频元素 java实现
算法
眠晚晚1 小时前
漏洞发现笔记分享
笔记·web安全·网络安全
云半S一2 小时前
春招准备之Redis篇
数据库·经验分享·redis·笔记·缓存
Xの哲學2 小时前
Linux设备管理:从内核驱动到用户空间的完整架构解析
linux·服务器·算法·架构·边缘计算
丝斯20113 小时前
AI学习笔记整理(26)—— 计算机视觉之目标追踪‌
人工智能·笔记·学习
('-')3 小时前
《从根上理解MySQL是怎样运行的》第二十五章笔记
数据库·笔记·mysql
xinyu_Jina3 小时前
Info Flow:去中心化数据流、跨协议标准化与信息源权重算法
算法·去中心化·区块链