131. Palindrome Partitioning

2023-05-16

文章目录

  • 1 题目理解
  • 2 回溯
  • 3 动态规划

1 题目理解

输入:字符串s
规则:将字符串s分割,分割后每一个部分都是一个回文串。
输出:所有的分割方式

Example 1:

Input: s = “aab”
Output: [[“a”,“a”,“b”],[“aa”,“b”]]
Example 2:

Input: s = “a”
Output: [[“a”]]

2 回溯

例如s=‘aab’
处理第0个字符a:a是回文吗?是继续处理(第1个字符)
                        aa是回文吗?是,继续处理(第2个字符)
                        aab是回文吗?不是,跳过

处理第1个字符a:a是回文吗?是继续处理(第2个字符)
                        ab是回文吗?不是

一直到最后

class Solution {
    private List<List<String>> answer;
    private String s;
    public List<List<String>> partition(String s) {
        answer = new ArrayList<List<String>>();
        this.s = s;
        dfs(0,new ArrayList<String>());
        return answer;
    }
    
    private void dfs(int index,List<String> list){
        if(index>= s.length()){
            answer.add(new ArrayList<String>(list));
            return;
        }
        
        for(int i=index+1;i<=s.length();i++){
            String str = s.substring(index,i);
            if(isPalindrome(str)){
                list.add(str);
                dfs(i,list);
                list.remove(list.size()-1);
            }
        }
    }
    
    private boolean isPalindrome(String s){
        int i = 0,j = s.length()-1;
        while(i<j){
            if(s.charAt(i)!=s.charAt(j)) return false;
            i++;
            j--;
        }
        return true;
    }
}

时间复杂度 O ( n ∗ n ! ) O(n*n!) O(nn!),第一个字符有n种可能,第二个字符有n-1种可能,第三个字符n-2种可能,所以是n!。每次判断是否是回文,时间复杂度O(n)。所以总体时间复杂度 O ( n ∗ n ! ) O(n*n!) O(nn!)

3 动态规划

判断是否是回文,可以进一步优化,使用动态规划。这道题目第一次做是2020年5月。还记得当时看到解题答案惊呼原来动态规划初始化还能这么玩!
逻辑是这样的 s=“aab”。
boolean[][] dp,dp[i][j]=true表示下标从i到j的字符串是回文。
对于每个单个字符肯定是回文。所以所有的dp[i][i]=true。
接着处理相邻的,如果s.char(i)=s.charAt(i+1),那么dp[i][i+1]=true。
长度为1,为2的已经处理了。
在这些字符串的基础上左右扩展,如果左右扩展的字符相同,则说明是回文。

class Solution {
    private List<List<String>> answer;
    private String s;
    private boolean[][] dp;
    public List<List<String>> partition(String s) {
        answer = new ArrayList<List<String>>();
        this.s = s;
        int n = s.length();
        dp = new boolean[n][n];
        for(int i=0;i<n;i++){
            dp[i][i] = true;
        }
        for(int i=0;i<n-1;i++){
            if(s.charAt(i)==s.charAt(i+1)){
                dp[i][i+1]=true;
            }
        }
        for(int len = 3;len<=n;len++){
            for(int i=0;i<=n-len;i++){
                int j = len + i - 1;
                if(s.charAt(i) == s.charAt(j) && dp[i+1][j-1]){
                    dp[i][j] = true;
                }
            }
        }
        dfs(0,new ArrayList<String>());
        return answer;
    }
    
    private void dfs(int index,List<String> list){
        if(index>= s.length()){
            answer.add(new ArrayList<String>(list));
            return;
        }
        
        for(int i=index+1;i<=s.length();i++){
            String str = s.substring(index,i);
            if(dp[index][i-1]){
                list.add(str);
                dfs(i,list);
                list.remove(list.size()-1);
            }
        }
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

131. Palindrome Partitioning 的相关文章

  • 检查字符串是否为回文

    A 回文是一个单词 短语 数字或其他单位序列 可以在任一方向以相同的方式阅读 为了检查一个单词是否是回文 我获取该单词的字符数组并比较字符 我测试了它 它似乎有效 但我想知道这是否正确或者是否有需要改进的地方 这是我的代码 public c
  • MySQL:将大表拆分为分区或单独的表?

    我有一个包含 20 多个表的 MySQL 数据库 但其中一个非常大 因为它从不同的传感器收集测量数据 它的磁盘大小约为 145 GB 包含超过 10 亿条记录 所有这些数据也被复制到另一台 MySQL 服务器 我想将数据分成更小的 碎片 所
  • 查找所有从主表“继承”的分区表

    假设我有一个表 foo 其中包含分区表 foo1 foo2 和 foo3 但目前我所知道的是有一些分区表继承自表 foo 如何找到 foo 有 3 个分区 foo1 foo2 和 foo3 列出所有分区 子表 使用 PG v9 v13 进行
  • SQL Server 2008:禁用某一特定表分区上的索引

    我正在 SQL Server 2008 中使用一个大表 约 100 000 000 行 我经常需要在该表中批量添加和删除约 30 000 000 行 目前 在将大批量加载到表中之前 我会禁用索引 插入数据 然后重建索引 我测量这是最快的方法
  • SQL Server:表中的行更改了顺序

    我创建了带有这样的数字的表 如何找到数据间隙并插入 NULL 数据点而不是有间隙 https stackoverflow com questions 20911946 sql how to find gaps of data and ins
  • SSAS 分区切片表达式

    我按最近 13 个月对多维数据集进行分区 然后使用旧分区来保存较早的月份 我已经成功创建了动态分区 但现在我需要为每个分区添加一个动态切片 我想我可以在分区切片表达式中使用它 Dim Date Month CStr Month Now la
  • 在运行时调整 MTD 分区大小

    我正在使用嵌入式设备 并希望它们能够通过 Linux 调整 MTD 分区的大小 而无需重新启动 问题是我的 Linux 映像大小已增加 并且它所在的当前 MTD 分区 mtd0 现在太小了 但是 紧随其后的分区 mtd1 是用于存储配置信息
  • 检查字符串是否为回文

    我有一个字符串作为输入 必须将字符串分成两个子字符串 如果左子串等于右子串 则执行一些逻辑 我怎样才能做到这一点 Sample public bool getStatus string myString 例子 myString ankYkn
  • PostgreSQL:更新意味着跨分区移动

    注 更新了下面采用的答案 对于 PostgreSQL 8 1 或更高版本 的分区表 如何定义一个分区表 UPDATE将记录从一个分区 移动 到另一个分区的触发器和过程 如果UPDATE是否意味着定义分区隔离的约束字段发生变化 例如 我有一个
  • Cassandra 牺牲了 CAP 定理的哪一部分?为什么?

    有一个很棒的演讲 https github com strangeloop StrangeLoop2013 blob master slides sessions Kingsbury PartitionsForEveryone pdf关于在
  • 什么是表分区?

    什么情况下我们应该使用表分区 一个例子可能会有所帮助 我们每天从 124 家杂货店收集数据 每天的数据都与其他日期完全不同 我们按日期对数据进行分区 这使我们能够更快地 因为oracle可以使用分区索引并快速消除所有不相关的天数 这还使备份
  • 优化配分函数

    这是Python中的代码 function for pentagonal numbers def pent n return int 0 5 n 3 n 1 function for generalized pentagonal numbe
  • 在 Apache Spark 中,为什么 RDD.union 不保留分区器?

    众所周知 Spark中的分区器对任何 宽 操作都会产生巨大的性能影响 因此通常在操作中进行定制 我正在尝试以下代码 val rdd1 sc parallelize 1 to 50 keyBy 10 partitionBy new HashP
  • SemanticException 分区规范 {col=null} 包含非分区列

    我正在尝试使用以下代码在配置单元中创建动态分区 SET hive exec dynamic partition true SET hive exec dynamic partition mode nonstrict create exter
  • Python 回文程序无法运行

    我用 python 编写了一个简单的程序 它检查句子是否是回文 但我不明白为什么它不起作用 结果始终为 False 有谁知道出了什么问题吗 def isPalindrome word Removes all spaces and lower
  • 了解荷兰国旗计划

    我正在读荷兰国旗问题 http en wikipedia org wiki Dutch national flag problem 但无法理解什么low and high参数在threeWayPartitionC 实现中的函数 如果我假设它
  • Java中StringBuilder如何逆向工作?

    我正在尝试解决这个leetcode问题https leetcode com problems palindrome linked list https leetcode com problems palindrome linked list
  • 如何最小化两个子多边形的最大纵横比?

    我想使用直线将凸多边形切成给定面积比的两部分 以使两个子多边形的较大纵横比最小化 目前我的方法包括选择一个随机起点 计算将多边形分割成目标区域的适当终点 然后计算两个纵横比中较大的一个 然后重复这个很多次 直到我足够接近最小值 多边形 A
  • Spark 在 WholeTextFiles 上创建的分区少于 minPartitions 参数

    我有一个文件夹 里面有 14 个文件 我在一个集群上使用 10 个执行器运行 Spark Submit 该集群的资源管理器为 YARN 我创建了我的第一个 RDD 如下所示 JavaPairRDD
  • SQL 错误:ORA-14006:无效的分区名称

    我正在尝试使用以下 SQL 语句对 Oracle 12C R1 中的现有表进行分区 ALTER TABLE TABLE NAME MODIFY PARTITION BY RANGE DATE COLUMN NAME INTERVAL NUM

随机推荐

  • 京东秒杀系统模块的Redis分布式锁深度剖析,没给你讲明白你打我!

    1 0背景 目前开发过程中 xff0c 按照公司规范 xff0c 需要依赖框架中的缓存组件 不得不说 xff0c 做组件的大牛对CRUD操作的封装 xff0c 连接池 缓存路由 缓存安全性的管控都处理的无可挑剔 但是有一个小问题 xff0c
  • 一次搞懂,Docker底层原理分析实战

    当今 xff0c Docker 技术已经形成了更为成熟的生态圈 xff0c 各家公司都在积极做业务容器化改造 xff0c 大家对 Docker 也都已经不再陌生 但在我刚接触 Docker 时 xff0c 市面上的资料还非常少 xff0c
  • RocketMq安装出现的问题

    RocketMq4 9 3版本下载安装问题 xff08 Win10 xff09 1 官网https rocketmq apache org docs quick start 找到下图中所示的链接 下载链接 解压到自己想要的目录下 xff0c
  • 阿里云服务器搭建fastdfs

    fastdfs安装介绍 环境准备 本人的阿里云服务器CentOS Linux release 7 9 2009 Core 版本 xff08 通过命令cat etc redhat release查看自己的Linux版本信息 xff09 过程中
  • win10搭建mysql主从复制的两个测试主从数据库

    mysql主从复制基础 win10电脑设置两个mysql数据库 卸载MySQL数据库 本人只是想把自己的mysql5 7 4升级为mysql8版本 xff0c 这里顺带记录一下 xff0c 以便有需要的人查看备份数据库 本人使用的是sqly
  • mac系统n工具下载node.js速度过慢(导致下载失败)

    n工具下载node js失败 n工具n工具下载node js失败的原因解决注意 n工具 n工具是mac系统用来管理多个node js版本的工具 xff0c 我们如果要使用到多个node js版本 xff0c 那么就可以使用n工具 xff0c
  • 使用Git小乌龟初始化本地仓库并且创建新的分支提交 删除分支(超详细图文教程,手把手教你做)

    前段时间入了小乌龟的坑 xff0c 最近项目需要多人合作 xff0c 就需要使用分支提交项目 xff0c 这里刚好就使用到了创建分支功能 xff0c 就记录一下使用的完整过程 文章目录 第一步 初始仓库 xff1a 1 1 创建完成项目会多
  • opencv笔试面试必背题目

    算法工程师 xff0c 技术软件类求职opencv必背八股文 更多算法 业务 HR面等笔试题面试题 gt 个性签名自取 xff01 1 opencv中RGB2GRAY是怎么实现的 答 xff1a 以R G B为轴建立空间直角坐标系 xff0
  • 我的新地址 http://www.cppblog.com/flyingxu/

    我的新地址 http www cppblog com flyingxu 这里的文章不会移过去 xff0c 也不会继续更新 xff0c 保持现状 以后会不会重新开始更新 xff0c 也不确定
  • px4+ros+gazebo+ORB_SLAM2室内视觉无人机导航

    px4 43 ros 43 gazebo 43 ORB SLAM2室内视觉无人机导航 一 ros 43 px4环境搭建 我用的ORB SLAM2视觉相机跑图首先要安装ros 43 px4环境 xff0c 我用的阿木实验室的镜像 xff0c
  • pc+tx2通信

    https blog csdn net RNG uzi article details 107285113
  • F4烧写PX4固件

    一 硬件准备 一个f4v3pro或者f4v3s飞控 xff0c 一根USB线 xff0c F450机架 xff0c ET07接收机和配套遥控器 xff0c 20A电调 xff0c 电机 xff0c 格式3s电池 1 无人机组装效果图 上 上
  • C++结构体类型变量

    C 43 43 定义结构体类型变量的方法 1 先声明结构体类型再定义变量名 xff0c 在定义了结构体变量后 xff0c 系统会为之分配内存单元 span class token keyword struct span Student sp
  • pycharm中如何安装tensorflow、cv2

    做卷积神经网络时用到了Python xff0c 记录一下遇到的问题 xff0c 首先 xff0c anaconda和pycharm的安装可按照网上的教程来 tensorflow的安装 但是 xff0c 当配置好解释器之后 xff0c 面临的
  • 【vscode和gitee】如何更改VsCode的gitee远程库地址,并提交到新的仓库中

    如何更改VsCode的gitee远程库地址 xff0c 并提交到新的仓库中 1 查看并更换git远程仓库地址 span class token number 1 span 查看当前remotes span class token funct
  • 【软件评测】03程序语言基础

    仅为学习记录 程序设计语言概述 低级语言 机器语言 xff1a 用二进制代码表示的计算机的指令等 xff0c 所有都是二进制表示 xff0c 计算机可以直接执行 xff0c 而不需要再次进行编译 优点 xff1a 执行效率较高 xff0c
  • 【软件评测】06计算机网络基础知识

    计算机网络基础知识 OSI RM七层模型七层模型TCP IP四层协议冲突域和广播域的区别 常见的协议协议族常见协议及对应端口常用的端口号 域名空间万维网Windows网络相关命令IP地址IP地址IP地址的分类IP地址掩码变长子网掩码特殊含义
  • 【软件评测】07安全性基础知识

    安全性基础知识 安全保护等级安全防护体系数据安全策略安全防护策略防火墙包过滤状态检测代理服务 安全协议 病毒与木马病毒木马 网络攻击访问控制访问控制实现方式身份验证方式 加密技术对称性加密技术非对称性加密技术单向加密PKI签名 43 加密
  • 【软件评测】09知识产权和项目管理基础知识

    仅为学习记录 知识产权 著作权概述 著作权 知识产权是指人们基于自己的智力活动所创造的成果和经营管理活动中的经验知识而依法享有的权利 知识产权的特点 xff1a 无形性 双重性 确认性 独创性 地域性 时间性 版权 xff08 著作权 xf
  • 131. Palindrome Partitioning

    文章目录 1 题目理解2 回溯3 动态规划 1 题目理解 输入 xff1a 字符串s 规则 xff1a 将字符串s分割 xff0c 分割后每一个部分都是一个回文串 输出 xff1a 所有的分割方式 Example 1 Input s 61