LeetCode 131 —— 分割回文串

1. 题目

2. 解题思路

首先,按照 LeetCode 5——最长回文子串 中的思路,我们先求出 d p dp dp,这样我们就知道了所有的子串是否是回文子串。

然后,我们进行一个 dfs 搜索,起始为 0 0 0,如果 d p [ 0 ] [ i ] dp[0][i] dp[0][i] 是回文子串,那么我们就在第 i i i 个位置进行第一次分割。

然后起始变为 i + 1 i+1 i+1,如果 d p [ i + 1 ] [ j ] dp[i+1][j] dp[i+1][j] 是回文子串,那么我们就在第 j j j 个位置进行第二次分割。

以此类推,直到把整个字符串切割完毕,就得到了其中的一个分割方案。

最坏的情况下,字符串中所有的字符都相等,那么怎么分割都是对的,假设字符串长度为 n n n,总共的分割方案有:

C n 1 + C n 2 + . . . + C n n − 1 = 2 n C^1_n+C^2_n+...+C^{n-1}_n=2^n Cn1+Cn2+...+Cnn1=2n

可以切割的次数为 1 1 1 n − 1 n-1 n1,然后在每个切割次数下,切割位置可以任意选择。而每一个切割方案我们都需要遍历字符串一次,时间复杂度为 O ( n ) O(n) O(n),所以,算法的整体时间复杂度为 O ( n ⋅ 2 n ) O(n \cdot 2^n) O(n2n),空间复杂度为 O ( n 2 ) O(n^2) O(n2)

3. 代码实现

class Solution {
public:
    vector<vector<string> > ret;
    void dfs(vector<vector<bool> >& dp, string& s, vector<string>& partition_s, int start) {
        for (int i = start; i < s.size(); ++i) {
            if (dp[start][i]) {
                partition_s.push_back(s.substr(start, i-start+1));
                if (i == s.size()-1) {
                    ret.push_back(partition_s);
                    partition_s.pop_back();
                    return;
                }
                dfs(dp, s, partition_s, i+1);
                partition_s.pop_back();
            }
        }
    }

    vector<vector<string>> partition(string s) {
        int n = s.size();
        vector<vector<bool> > dp(n, vector<bool>(n, false));
        for (int i = 0; i < n; ++i) {
            for (int j = i; j >= 0; --j) {
                dp[i][j] = true;
            }
        }
        for (int len = 1; len < n; ++len) {
            for (int i = 0; i < n - len; ++i) {
                if (s[i] == s[i+len] && dp[i+1][i+len-1]) {
                    dp[i][i+len] = true;
                }
            }
        }
        vector<string> partition_s;
        dfs(dp, s, partition_s, 0);
        return ret;
    }
};

相关推荐

  1. leetcode 131. 分割

    2024-05-04 05:52:04       36 阅读
  2. leetcode热题HOT leetcode131. 分割

    2024-05-04 05:52:04       21 阅读
  3. 131. 分割

    2024-05-04 05:52:04       33 阅读
  4. 131. 分割

    2024-05-04 05:52:04       36 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-04 05:52:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-04 05:52:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-04 05:52:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-04 05:52:04       18 阅读

热门阅读

  1. ElasticSearch安装和可视化安装

    2024-05-04 05:52:04       10 阅读
  2. 如何看待AIGC技术?【模板】

    2024-05-04 05:52:04       9 阅读
  3. python和R对比记忆

    2024-05-04 05:52:04       8 阅读
  4. Vue 2 组件创建全指南:一步一步学习

    2024-05-04 05:52:04       12 阅读
  5. NLP自然语言处理和应用场景介绍

    2024-05-04 05:52:04       6 阅读
  6. react 列表渲染 key解析和 vue的key解析的底层逻辑

    2024-05-04 05:52:04       13 阅读
  7. C++11 设计模式6. 建造者模式,也叫做生成器模式

    2024-05-04 05:52:04       11 阅读
  8. Python基础学习之数据结构

    2024-05-04 05:52:04       10 阅读
  9. 指针(1)

    指针(1)

    2024-05-04 05:52:04      8 阅读
  10. Mybatis扩展

    2024-05-04 05:52:04       9 阅读