--- 算法 分割回文串 回溯 + 动态规划预处理 ---

题目解释的特别清楚了,不过还有个,因为只有一个字母也叫回文串,那么其实所有的字母都会被使用到

那么要不重复的遍历一遍字符串的所有子串,并且要记录下每个子串,递归回溯就很适合

不过这样每次递归到一个子串,就去判断他是否为回文串,那么时间复杂度肯定要高到天上了,

而其实对于回文串,有 如果 l ,r 是一个回文串 那么他们的 l + 1, r - 1 也肯定是一个回文串, 对于单个字符 会发现 l + 1 > r - 1 那么这种特殊情况可以直接处理为 是回文串

那么就可以发现一个式子 dpij = si == sj && dpi + 1j -1

我靠这不是动态规划吗, 没错 可是使用动态规划来预处理字符串来将所有的回文串记录到dp表中 这样O(1) 的复杂度下就能判断是否为回文串了

所以这题解法式 动态规划预处理 + 递归回溯遍历所有子字符串

java 复制代码
 List<List<String>> ans = new ArrayList<>();
    List<String> path = new ArrayList<>();
    boolean[][] dp;
    public  List<List<String>>partition(String s) {
        int n = s.length();
        dp = new boolean[n][n];

        for(int i = 0; i < n; i++){
            Arrays.fill(dp[i], true);
        }

        Set<String> set = new HashSet<>();
        //  预处理 从下向上 左往右 相同的位置因为l+1会越界,就不取反正都为true
        for(int l = n - 1; l >= 0; l--){
            for(int r = l + 1; r < n; r++){
                dp[l][r] = s.charAt(l) == s.charAt(r) && dp[l + 1][r - 1];               
            }
        }

        // 递归所有可能 然后找打可能的组合 用dp来判断是否是回文串
        dfs(s, 0);
        return ans;
    }

    void dfs(String ss, int l){
        if(l == ss.length()){
            ans.add(new ArrayList(path));
            return;
        }
        
        for(int r = l; r < ss.length(); r++){
            if(dp[l][r]){
                path.add(ss.substring(l, r + 1));
                dfs(ss, r + 1);
                path.remove(path.size() - 1);
            }
        }
    }

还是挺有意思居然用了俩种算法

相关推荐
倒头就睡的小比特1 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼1 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光1 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark1 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her11 天前
并查集-听课笔记
笔记·算法·并查集
码流子1 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven1 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark1 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218611 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法