LeetCode 131 —— 分割回文串

news2024/11/25 3:04:06

阅读目录

    • 1. 题目
    • 2. 解题思路
    • 3. 代码实现

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;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1639960.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

汇报进度26届cpp,目前来说之后的规划,暑假打算回家10天就留校沉淀了

汇报一下进度吧&#xff0c;26双非菜鸡&#xff0c;cpper. 但目前学了一些go &#xff0c;辅修吧&#xff0c;距离发的上个动态已经过去3个月了&#xff0c;真的觉得找实习时间来不及&#xff0c;现在leetcode 100多道题&#xff0c;前几天蓝桥杯整了个省二&#xff0c;把OS和…

Spark01 —— Spark基础

文章目录 Spark01 —— Spark基础一、为什么选择Spark&#xff1f;1.1 MapReduce编程模型的局限性1.2 Spark与MR的区别1.3 版本1.4 优势1.5 Spark其他知识1、多种运行模式2、技术栈3、spark-shell&#xff1a;Spark自带的交互式工具4、Spark服务 二、Spark的基础配置三、Spark实…

ue引擎游戏开发笔记(26)——处理角色死亡敌人仍攻击bug

1.需求分析 对游戏中存在的各种小问题做细节处理&#xff0c;例如玩家在死亡后&#xff0c;敌人仍对着目标开炮&#xff0c;并且仍然触发爆炸效果。 2.操作实现 1.首先分析问题起因&#xff0c;是由于虽然玩家控制的小车被摧毁了&#xff0c;但控制器仍然存在&#xff0c;没有…

Llama 3消费级PC安装与运行教程

我是 Llama 的忠实粉丝。 Meta 发布其 LLM 开源代码对整个科技界来说是一项净收益&#xff0c;其宽松的许可证允许大多数中小型企业在几乎没有任何限制的情况下使用其 LLM&#xff08;当然&#xff0c;在法律范围内&#xff09;。 他们的最新版本是备受期待的 Llama 3。 Llama…

自定义 Dockerfile 构建 PostgreSQL 15 编译版 Docker 镜像

BG 前几日 Sean 老师发布了一篇文章 – PostgreSQL安装(一): 再简单点儿&#xff0c;用Docker?, 介绍如何快速安装启动 PostgreSQL 数据库。 本文再稍微延伸一点&#xff0c;介绍一下如何自定义 Dockerfile&#xff0c;加入自己想要预制的参数&#xff0c;构建一个自定义的 …

C语言----贪吃蛇(补充)

各位看官好&#xff0c;我想大家应该已经看过鄙人的上一篇博客贪吃蛇了吧。鄙人在上一篇博客中只是着重的写了贪吃蛇的实现代码&#xff0c;但是前期的一些知识还没有具体的介绍&#xff0c;比如确认光标位置&#xff0c;句柄等。那么我这一篇博客就来补充上一篇博客所留下来的…

笔试狂刷--Day9(模拟 + dp + 规律)

大家好,我是LvZi,今天带来笔试狂刷--Day9 一.添加逗号 题目链接:添加逗号 分析: 模拟 代码: import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);i…

社交媒体数据恢复:TT语音

TT语音数据恢复方法 1. 恢复聊天记录 如果您的TT语音聊天记录丢失&#xff0c;可以通过以下步骤尝试恢复&#xff1a; 登录TT语音&#xff1a;首先&#xff0c;您需要登录您的TT语音账户。如果您忘记了密码&#xff0c;可以通过点击登录页面的“忘记密码”链接&#xff0c;然…

【强训笔记】day7

NO.1 思路&#xff1a;双指针模拟&#xff0c;begin表示最长数字字符串最后一个字符&#xff0c;而len表示数字字符串的长度&#xff0c;i用来遍历&#xff0c;如果为数字&#xff0c;那么定义j变量继续遍历&#xff0c;直到不为数字&#xff0c;i-j如果大于len&#xff0c;就…

基于寄存器的STM32操作流程

寄存器点灯 寄存器操作STM32的好处是不需要依靠外部文件&#xff0c;自由度更高&#xff0c;更为底层&#xff0c;但也更加繁杂。 通过寄存器点灯&#xff0c;需要按照电路结构与手册配置寄存器&#xff1a; 电路结构如下&#xff1a;可知需配置的GPIO为GPIOB5与GPIOE5。 在…

机器学习之基于Jupyter中国环境治理投资数据分析及可视化

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 机器学习之基于Jupyter中国环境治理投资数据分析及可视化项目是一个结合了机器学习和数据可视化技术的项目&#xf…

SoapUI-x64-5.7.2安装教程

http://localhost:49652/Test.asmx?WSDL 双击请求&#xff1a;

Word技巧:3种方法快速重复上一步操作

在编辑Word文档的时候&#xff0c;我们经常需要重复上一步操作&#xff0c;如果重复性的操作很多&#xff0c;就会很耽误时间&#xff0c;那怎么可以快速重复上一步操作呢&#xff1f;下面分享3种方法&#xff0c;一起来看看吧&#xff01; 方法1&#xff1a;利用“格式刷”功能…

利用亚马逊云科技GenAI企业助手Amazon Q Business构建企业代码开发知识库

2024年五一节假日的前一天&#xff0c;亚马逊云科技正式重磅发布了云计算行业期待已久的服务——Amazon Q Business。Amazon Q Business是专为企业用户打造的一个开箱即用的完善而强大企业GenAI助手。企业用户只需要将Amazon Q Business连接到现有的企业内部数据源&#xff0c;…

【免费Java系列】大家好 ,给大家出一些今天学习内容的案例点赞收藏关注,持续更新作品 !

PS:每个内容块下都有教学博文的超链接,有需要可以点过去学习 ! 目录 匿名内部类 1. 实现接口 2. 继承抽象类 3. 实现事件处理 枚举 1. 定义一个简单的枚举类型 2. 枚举类型可以有属性和方法 3. 枚举类型可以实现接口 泛型 1. 定义一个泛型类 2. 使用泛型方法 3. 泛型…

华为手机 鸿蒙系统-android studio识别调试设备,开启adb调试权限

1.进入设置-关于手机-版本号&#xff0c;连续点击7次 认证&#xff1a;有锁屏密码需要输入密码&#xff0c; 开启开发者配置功能ok 进入开发者配置界面 打开调试功能 重新在androd studio查看可运行running devices显示了&#xff0c; 不行的话&#xff0c;重启一下android …

【Flask 系统教程 4】Jinjia2模版和语法

Jinjia2 模板 模板的介绍 Jinja2 是一种现代的、设计优雅的模板引擎&#xff0c;它是 Python 的一部分&#xff0c;由 Armin Ronacher 开发。Jinja2 允许你在 HTML 文档中嵌入 Python 代码&#xff0c;以及使用变量、控制结构和过滤器来动态生成内容。它的语法简洁清晰&#…

U盘未初始化?别慌,数据还有救!

当我们将U盘插入电脑&#xff0c;期待地打开“我的电脑”或文件管理器&#xff0c;却发现U盘显示为未初始化&#xff0c;这种心情无异于一盆冷水浇头。但先别急着慌张&#xff0c;这篇文章将带你了解U盘未初始化的原因&#xff0c;并提供有效的数据恢复方案&#xff0c;让你在遭…

24.5.2数据结构|顺序表实现

主要是记笔记&#xff0c;留着以后复习回来看的&#xff0c;有些内容解释的并不清晰。也就稍微可以借鉴借鉴。 目录 一、如何定义结构&#xff1f; 二、看书搞清楚顺序表实现流程 三、使用clion写代码 实现代码过程中的错误代码 一、如何定义结构&#xff1f; 应该有的部…

AI与电力

好多写AI会导致电力匮乏的消息,不绝于耳。然而大部分只能知其然,却不能知其所以然,为什么缺,怎么缺,缺多少,没什么答案也没什么可参考的。 我关注一个事情,一般先了解一下论点,然后重点看论据,最后再自己论证合理不。今天这篇文章主要聊一下数据层面上是谈一谈AI如何导…