LeetCode -- 131.分割回文串

news/发布时间2024/9/20 7:59:38

1. 问题描述

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串。

示例 1:
输入:s = “aab”
输出:[[“a”,“a”,“b”],[“aa”,“b”]]

示例 2:
输入:s = “a”
输出:[[“a”]]

2. 思路一(回溯法暴力搜索)

将字符串s的所有分割方式都搜索出来,然后一个一个判断是否满足回文串的条件,即可求得答案。那么,如何表示分割方式且回溯求得所有分割方式呢?

拿示例1举例,字符串s = "aab,初始化列表path为空。

先看第一个字符a,由于他是第一个字符,所以他无法和之前的字符(因为没有)结合,所以他单独加入path,此时path为[“a”]。第一个字符完成。

之后看第二个字符a,他就有两种选择。

  • 与之前的字符a合并,此时代表再字符串的第二个字符处进行分割,那么此时path为[”aa“]
  • 不与之前的字符合并,单独加入path,此时代表再字符串的第一个字符以及第二个字符都进行分割,此时path为[“a”, “a”]

继续看第三个字符、第四个字符。。。。。。直到字符串结束。这样就完成了暴力搜索。

代码如下:

public List<List<String>> partition(String s) {//存放结果List<List<String>> res = new ArrayList<>();//特殊情况if(s == null || s.length() == 0) {return res;}//存放当前分割结果List<String> path = new ArrayList<>();//递归搜索dfs(res, s, path, 0, 0);return res;}//depth表示当前在判断字符串s的第depth+1个字符,start记录上一个字符在path中的位置,因为当前字符可能需要与上一个字符拼接private void dfs(List<List<String>> res, String s, List<String> path, int depth, int start) {//如果最后一个字符也已经加入path,且满足都是回文串的条件,则把此时的path加入到结果res中if(depth == s.length()) {if(isTrue(path)) {res.add(new ArrayList<>(path));}return;}for (int i = start; i < path.size(); i++) {String str = path.get(i);str += s.charAt(depth);path.set(i, str);dfs(res, s, path, depth + 1, i);str = str.substring(0, str.length() - 1);path.set(i, str);}path.add(String.valueOf(s.charAt(depth)));dfs(res, s, path, depth + 1, path.size() - 1);path.remove(path.size() - 1);}private boolean isTrue(List<String> path) {for (String s : path) {int start = 0;int end = s.length() - 1;while (start < end) {if (s.charAt(start) == s.charAt(end)) {start++;end--;} else {return false;}}}return true;}

但这种思路只在最后进行条件判断,因此需要将所有情况遍历一遍,耗时较久

那么,在这个基础上进行改进,则是在遍历时,就加入条件判断,提前将不满足的情况去除,减小递归次数。

3. 思路二(回溯法 + 剪枝)

由于条件要求所有子串要都满足回文串的条件,因此我们对字符串s进行遍历,只有当当前子串满足回文串,才会接着考虑之后的字符。

还是拿示例一“aab”举例。

首先看第一个字符a,字符a满足回文串,那么递归考虑剩下的字符串“ab”。

  • 同理,对于ab,也是先考虑第一个字符”a“,符合条件,考虑剩下的“b"。b也满足条件,那么此时递归完成,得到一个答案[“a”, “a”, “b”]。
  • 考虑ab的第二个字符,此时子串”ab“不满足回文串条件,也就是说当前分割[“a”, “ab”]不满足条件,之后的字符串也不考虑,结束。

接着看第二个字符。此时当前第一个子串就是前两个字符”aa“,也满足回文串的条件,那么接着考虑剩下的字符"b",显然b也满足,因此,此时得到一个答案[“aa”, “b”]。

之后看第三个字符。此时当前子串是”aab“,不满足回文串条件,直接结束。

此时由于已经将字符串的所有字符都考虑结束,结束搜索,一共有两个答案。

代码如下:

public List<List<String>> partition(String s) {List<List<String>> res = new ArrayList<>();if(s == null || s.length() == 0) {return res;}List<String> path = new ArrayList<>();dfs(s, 0, res, path);return res;}//start表示当前在考虑字符串s的第start+1个字符private void dfs(String s, int start, List<List<String>> res, List<String> path) {if(start == s.length()) {res.add(new ArrayList<>(path));return;}for (int i = start; i < s.length(); i++) {//如果当前下标从start到i的子串满足回文串条件,回溯搜索剩余的子串,即下标从i+1开始if(isPalindrome(s, start, i)) {//更新path,将子串加入当前分割结果path.add(s.substring(start, i + 1));dfs(s, i + 1, res, path);//回溯结束,状态重置path.remove(path.size() - 1);}}}//判断当前字符串s中,下标从start到end的子串是否为回文串private boolean isPalindrome(String s, int start, int end) {while (start <= end) {if(s.charAt(start) == s.charAt(end)) {start++;end--;}else {return false;}}return true;}

可以看到,在搜索时加入条件判断,可以有效地加快搜索速度。

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

如若内容造成侵权/违法违规/事实不符,请联系编程老四网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

网络爬虫的危害,如何有效的防止非法利用

近年来&#xff0c;不法分子利用“爬虫”软件收集公民隐私数据案件屡见不鲜。2023年8月23日&#xff0c;北京市高级人民法院召开北京法院侵犯公民个人信息犯罪案件审判情况新闻通报会&#xff0c;通报侵犯公民个人隐私信息案件审判情况&#xff0c;并发布典型案例。在这些典型案…

Centos中安装Docker及Docker的使用

在centos7系统中安装指定版本的docker,并通过docker使用安装mysql为例,阐述docker的使用。 2.1、Docker卸载及安装yum依赖 【卸载Docker,如果安装的Docker的版本不合适】 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-…

使用Node.js构建一个简单的聊天机器人

当谈到人工智能&#xff0c;我们往往会想到什么&#xff1f;是智能语音助手、自动回复机器人等。在前端开发领域中&#xff0c;我们也可以利用Node.js来构建一个简单而有趣的聊天机器人。本文将带你一步步实现一个基于Node.js的聊天机器人&#xff0c;并了解其工作原理。 首先…

Vue源码系列讲解——实例方法篇【一】(数据相关方法)

目录 0. 前言 1. vm.$watch 1.1 用法回顾 1.2 内部原理 2. vm.$set 2.1 用法回顾 2.2 内部原理 3. vm.$delete 3.1 用法回顾 3.2 内部原理 0. 前言 与数据相关的实例方法有3个&#xff0c;分别是vm.$set、vm.$delete和vm.$watch。它们是在stateMixin函数中挂载到Vue原…

德人合科技 | —数据泄露可能会对公司造成哪些影响?

数据泄露可能会对公司造成多方面的影响&#xff0c;以下是一些可能的影响&#xff1a; 财务损失&#xff1a;数据泄露可能导致公司遭受财务损失。攻击者可能会盗取公司的敏感信息&#xff0c;如客户信息、银行账户信息、商业机密等&#xff0c;并利用这些信息进行欺诈、盗窃等非…

用户案例|GreptimeDB 助力贵州某机场智慧能源物联网系统

近年来&#xff0c;云计算和物联网技术的飞速发展促使许多传统单位的用电、用能系统向数字化、信息化、智能化的方向迈进&#xff0c;旨在实现全过程的实时智能协同&#xff0c;提高生产效率。而随着电力采集、监测数据功能的不断增强&#xff0c;数据量也在不断增加&#xff0…

OpenHarmony 串口服务访问

项目介绍 本文档是在eTS项目hap包中实现串口访问的使用说明&#xff0c;通过JS接口开放给上层应用使用。 一、开发环境准备 安装OpenHarmony SDK 1. 在DevEco Studio菜单栏选择Tools->SDK Manager 2. OpenHarmony SDK选项中选择配备API版本进行安装 二、创建eTS项目 创…

springcloud alibaba组件简介

一、Nacos 服务注册中心/统一配置中心 1、介绍 Nacos是一个配置中心&#xff0c;也是一个服务注册与发现中心。 1.1、配置中心的好处&#xff1a; &#xff08;1&#xff09;配置数据脱敏 &#xff08;2&#xff09;防止出错&#xff0c;方便管理 &#xff08;3&#xff…

前端开发——ElementUI组件的使用

文章目录 1. Tabs标签页2. 单选框 el-radio3. 复选框 el-checkbox4. 下拉框 el-select5. 表格 el-table6. 对话框 el-dialog7. 文字提示 el-tooltip8. 抽屉 el-drawer 1. Tabs标签页 <template><el-tabs v-model"activeName" tab-click"handleClick&q…

AI智能分析网关V4:抽烟/打电话/玩手机行为AI算法及场景应用

抽烟、打电话、玩手机是人们在日常生活中常见的行为&#xff0c;但这些行为在某些场合下可能会带来安全风险。因此&#xff0c;对于这些行为的检测技术及应用就变得尤为重要。今天来给大家介绍一下TSINGSEE青犀AI智能分析网关V4抽烟/打电话/玩手机检测算法及其应用场景。 将监控…

Mint_21.3 drawing-area和goocanvas的FB笔记(二)

一、goocanvas安装 Linux mint 21.3 库中带有 libgoocanvas-2.0-dev, 用sudo apt install libgoocanvas-2.0-dev 安装&#xff0c;安装完成后&#xff0c;检查一个 /usr/lib/x86_64-linux-gnu 下是否有libgoocanvas.so的软件链接。如果没有&#xff0c;或是 .so.x 等类似后面…

spring自定义事件监听器

1. 创建自定义事件 import org.springframework.context.ApplicationEvent; import java.util.List;public class CollectionCreateEvent extends ApplicationEvent {private List<String> fileList;public CollectionCreateEvent(Object source,List<String> file…

Centos 7.5 上nginx设置开机自启动

nginx的安装目录 &#xff1a; /usr/local/nginx 一、没有设置开机自启动前&#xff0c;需要执行/usr/local/nginx/sbin/nginx 启动 二、接下来&#xff0c;我们设置开机自启动&#xff0c;就不用手动启动nginx了 1、cd /usr/lib/systemd/system/ 2、vi nginx.service [un…

零成本建站方案之Github Pages

之前的文章中介绍了如何申请AWS免费服务器并使用WordPress来搭建个人网站&#xff0c;今天给大家介绍一种无需任何硬件资源&#xff0c;也就是不需要准备服务器就可以搭建一个网站的方案&#xff0c;那就是使用github pages来搭建一个静态网站。 第一步&#xff0c;需要准备一个…

C语言第三十三弹---动态内存管理(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 动态内存管理 1、为什么要有动态内存分配 2、malloc和free 2.1、malloc 2.2、free 3、calloc和realloc 3.1、calloc 3.2、realloc 4、常见的动态内存的错…

Linux添加用户分组练习

一、复制/etc/skel目录为/home/tuser1&#xff08;/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限&#xff09;。 cp -a /etc/skel /home/tuser1 chown -R tuser1:tuser1 /home/tuser1 chmod -R 700 /home/tuser1 二、编辑/etc/group文件&#xff0c;添加组h…

IPD(集成产品开发)—核心思想

企业发展到一定阶段就会遇到管理瓶颈&#xff0c;IPD流程是一种高度结构化的产品开发流程&#xff0c;它集成了业界很多优秀的产品开发方法论&#xff0c;像搭积木一样的组合成一种非常有效的流程。如果我们能根据企业的规模和行业特点&#xff0c;对全流程的IPD进行合适的裁剪…

【音视频处理】使用ffmpeg实现多个视频合成一个视频(按宫格视图)

先上结果 环境 硬件&#xff1a;通用PC 系统&#xff1a;Windows 测试有效 软件&#xff1a;ffmpeg 解决 0、命令 ffmpeg.exe -i input1.mp4 -i input2.mp4 -i input3.mp4 -i input4.mp4 -filter_complex "[0:v]scaleiw/2:ih/2,pad2*iw:2*ih[a]; [1:v]scaleiw/2:ih/2…

136. 只出现一次的数字【简单】

136. 只出现一次的数字【简单】 题目描述&#xff1a; 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使…

今年国内石油需求稳中有升,巡检机器人助力石油行业可持续发展

前言&#xff1a;全球能源市场出现普遍回落趋势&#xff0c;其中石油价格下降近20%&#xff0c;而天然气和煤炭价格更是下跌超过50%。此外&#xff0c;碳酸锂和光伏组件价格也纷纷下降超过50%。这种价格下滑对于全球经济的持续增长&#xff0c;尤其是控制通货膨胀方面&#xff…
推荐文章