leetcode 131. 分割回文串

leetcode 131. 分割回文串

题目

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

回文串 是正着读和反着读都一样的字符串。

示例 1:

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

输入:s = “a”
输出:[[“a”]]

提示:

1 <= s.length <= 16
s 仅由小写英文字母组成

思路

这题说实话,一开始合计的是一个个加进来,然后当前最后一个字符串加上新的字符是回文串就继续dfs,然后不管最后一个字符串加上新的字符是不是回文串这里都要断开。这样就能保证所有情况的覆盖,因此有了第一版代码。但这WA了。。。因为没考虑所谓回文串aba是回文串,新的字符是c可能不是回文串,但再往后加可能是abacaba,这又是回文串了。所以我们得考虑这种情况。于是有了第二版,AC了。看了剪枝操作,有了第三版,不用每次都判断回文串了,而是用一个数组存储各种情况,在本题中最长就16字符,所以效果不明显,之后这种空间换时间的思路还是要记得的。

题解

// 第一版
class Solution {List<List<String>> list = new ArrayList<>();List<String> subList = new ArrayList<>();boolean st[];public List<List<String>> partition(String s) {st = new boolean[s.length()];dfs(s, 0);return list;}public boolean isOk(String item, char i) {if (item.charAt(0) != i) {return false;}int st = 1, ed = item.length() - 1;while (st < ed) {if (item.charAt(st) != item.charAt(ed)) {return false;}st++;ed--;}return true;}public boolean gap(int idx) {for (int i=idx-1;i>-1;i--) {if (st[i] == false) {return true;}}return false;}public void dfs(String s, int idx) {if (idx == s.length()) {list.add(new ArrayList<>(subList));return;}for (int i=idx;i<s.length();i++) {if (gap(i)) {return;}if (subList.isEmpty()){subList.add(String.valueOf(s.charAt(i)));st[i] = true;dfs(s, i + 1);subList.remove(0);st[i] = false;}else if (isOk(subList.get(subList.size() - 1), s.charAt(i))) {String tmp = subList.get(subList.size() - 1);subList.remove(subList.size() - 1);subList.add(tmp + String.valueOf(s.charAt(i)));st[i] = true;dfs(s, i + 1);subList.remove(subList.size() - 1);subList.add(tmp);st[i] = false;}if (! subList.isEmpty()) {subList.add(String.valueOf(s.charAt(i)));st[i] = true;dfs(s, i + 1);subList.remove(subList.size() - 1);st[i] = false;}}}
}
// 第二版
class Solution {List<List<String>> list = new ArrayList<>();List<String> subList = new ArrayList<>();public List<List<String>> partition(String s) {dfs(s, 0);return list;}public boolean isOk(String item) {int st = 0, ed = item.length() - 1;while (st < ed) {if (item.charAt(st) != item.charAt(ed)) {return false;}st++;ed--;}return true;}public void dfs(String s, int idx) {if (idx == s.length()) {list.add(new ArrayList<>(subList));return;}for (int i=idx;i<s.length();i++) {String str = s.substring(idx, i + 1);if (isOk(str)) {subList.add(str);dfs(s, i + 1);subList.remove(subList.size() - 1);}else {continue;}}}
}
// 第三版
class Solution {List<List<String>> list = new ArrayList<>();List<String> subList = new ArrayList<>();// 空间换时间boolean[][] isPartition;public List<List<String>> partition(String s) {isPartition = new boolean[s.length()][s.length()];isOk(s);dfs(s, 0);return list;}public void isOk(String item) {for (int i=0;i<item.length();i++) {for (int j=i;j<item.length();j++) {int st = i, ed = j;while (st < ed) {if (item.charAt(st) != item.charAt(ed)) {break;}st++;ed--;}if (st >= ed) {isPartition[i][j] = true;}}}      }public void dfs(String s, int idx) {if (idx == s.length()) {list.add(new ArrayList<>(subList));return;}for (int i=idx;i<s.length();i++) {// 基于当前subList已有的回文串,以及当前idx开始往后i - idx位,只要有回文串就放里if (isPartition[idx][i]) {String str = s.substring(idx, i + 1);subList.add(str);dfs(s, i + 1);subList.remove(subList.size() - 1);}else {continue;}}}
}

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

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

相关文章

MFC 进度条CProgressCtrl

2019独角兽企业重金招聘Python工程师标准>>> SetStep(1);//设置步长 SetRange32(0, total);//设置范围 SetPos(_cur);//设置当前 进度 StepIt();进步一次 转载于:https://my.oschina.net/kkkkkkkkkkkkk/blog/688392

css限制字体三行_讲道理,仅3行核心css代码的rate评分组件,我被自己秀到头皮发麻...

(给100素材网点亮★号&#xff0c;提升开发技能)像rate评分组件一般都用javascript写&#xff0c;所以这次将是一个全新的尝试&#xff0c;用css实现一个rate评分 ❗ 核心代码也就三行?01效果图02原理主要是借助radio单选框&#xff0c;梳理如下&#xff1a;去找个好看的iconf…

matlab GUI之自定义菜单小结

自定义菜单 1.uimenu对象 huimenu(PropertyName,ProperValue) huimenu(parent,PropertyName,ProperValue) 常见属性&#xff1a; 1.1标签 label uimenu(label,&Open) 1.2快捷键 Accelerator uimenu(Accelerator,E) 快捷键位 ctrlE 注意以下三个是系统保留的Accelerator…

把cpp编译为so_基于VSCode和CMake进行C/C++开发第三讲GCC编译器

3.0 本讲目录本系列视频&#xff0c;B站首发&#xff0c;up主: xiaobing1016前言&#xff1a;GCC 编译器支持编译 Go、Objective-C&#xff0c;Objective-C &#xff0c;Fortran&#xff0c;Ada&#xff0c;D 和 BRIG(HSAIL)等程序&#xff1b;Linux 开发C/C 一定要熟悉 GCCVS…

mysql 表锁——读锁和写锁

注意&#xff0c; 0、表的索引类型必须是InnoDB.相关链接&#xff1a;http://www.cnblogs.com/CyLee/p/5579672.html 1、如果你使用Navicat Premium&#xff0c;有可能会出现程序bug无法解锁。但在正常环境下是没问题的 2、存储过程里不允许使用锁 3、phpmyadmin是每次刷新都会…

自动化测试遇到的难点_自动化测试过程中遇到的问题主要有什么?

1自动化测试过程中遇到的问题主要有什么&#xff1f;问题&#xff1a;自动化测试过程中遇到的问题主要有什么&#xff1f;回答&#xff1a;1.对自动化测试的期望值太高。很多人想把自动化测试完全替代人工测试&#xff0c;如果期望不现实&#xff0c;无论测试工具如何&#xff…

CSS快速入门-箭头和图标

一、三步搞懂箭头产生的原理 在前面的盒子模型一文中&#xff0c;我们已经知道了一个元素空间占位。为了弄明白箭头的产生&#xff0c;我们可以三步走&#xff1a; #demo12 {border: 100px solid;border-color:green blue orange red;width:100px;height:100px;}<div id&quo…

[LeetCode] Count Numbers with Unique Digits 计算各位不相同的数字个数

Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n. Example: Given n 2, return 91. (The answer should be the total numbers in the range of 0 ≤ x < 100, excluding [11,22,33,44,55,66,77,88,99]) Hint: A direct…

模糊查询一--视图写sql

《1》模糊查询&#xff0c;最快捷的方式 第一步&#xff1a;cip_admin_domain&#xff08;option字段A&#xff09; ---> 里面配置&#xff08;option字段A&#xff09;属性&#xff0c;defalut_value设置初始值&#xff08;如&#xff1a;创建新项目&#xff0c;其创建后的…

自动清理归档日志_从MYSQL 数据库归档 到 归档设计

到数据归档&#xff0c;很多人的第一个概念就是&#xff0c;不就是无用的数据&#xff0c;换个地方放吗&#xff0c;直接拷贝&#xff0c;删除不就得了&#xff0c;有那么麻烦。我见到过的&#xff0c;听到过的数据库归档的方法有以下几种1 数据通过人工的手段来进行清理&…

Android支付宝SDK开发笔记

一、准备工作 〉1、下载开发包 https://b.alipay.com/order/productDetail.htm?productId2014110308141993&tabId4#ps-tabinfo-hash 压缩包下的“支付宝钱包支付接口开发包”中即有Andoid使用支付宝的JAR和Demo 〉2、创建支付宝应用 在支付宝开放平台申请创建应用 https:/…

全栈测试:平衡单元测试和端到端测试

全栈开发人员的特点是能够从头到尾交付并发布一个特性。教程和书籍常常侧重于搭建全栈开发环境和让测试能够进行所需要的“管件&#xff08;plumbing&#xff09;”&#xff08;我综合运用了Angular、Rails、Bootstrap和Postgres&#xff09;。但对于如何贯穿整个Web开发栈进行…

linux 命令/目录 名称 英文单词 缩写 助记

注&#xff1a;以下内容转自https://www.zhihu.com/question/49073893?sortcreated&#xff0c;作者是一个高中的学生&#xff0c;能总结这么多这么好&#xff0c;真心赞扬。这么好的知识我怕在互联网上流失&#xff0c;所以在这里做了一个备份。 以下内容仅供参考&#xff0c…

python文件处理seek()方法的参数是_Python 文件(File) seek() 方法

例如&#xff1a;将当前文件位置更改为4&#xff0c;然后返回其余行&#xff1a;f open("demofile.txt", "r")f.seek(4)print(f.readline())1、定义和用法seek()方法设置文件流中的当前文件位置。seek()方法如果操作成功&#xff0c;则返回新的文件位置&a…

一天一个类,一点也不累之HashSet

最近忙着一个小项目结题&#xff0c;故没能按时完成【一天一个类&#xff0c;一点也不累】&#xff0c;还好项目优秀&#xff0c;算是对自己一点点的安慰和鼓励。~~~ 今天要说的是HashSet 既然是继承自Set&#xff0c;那么就必须有Set的一些属性&#xff0c;比如不能容许有相同…

[BZOJ1502]月下柠檬树(自适应辛普森积分)

1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1387 Solved: 739[Submit][Status][Discuss]Description 李哲非常非常喜欢柠檬树&#xff0c;特别是在静静的夜晚&#xff0c;当天空中有一弯明月温柔地照亮地面上的景物时&#xff0c;他必会悠闲地…

擎天出口退税软件_新版申报系统退税申报注意事项

前言&#xff1a;随着税务信息化建设“后金三”时代的不断深入,2019年年底国家税务总局启动出口退税管理系统整合(进入金税三期)项目&#xff0c;经过广东、大连两个地区试点&#xff0c;即将于今年年底前在全国完成金税三期审核系统的上线工作&#xff0c;至此&#xff0c;出口…

词性标注

4.10 词性标注 词性用来描写叙述一个词在上下文中的作用。比如描写叙述一个概念的词叫做名词&#xff0c;在下文引用这个名词的词叫做代词。有的词性常常会出现一些新的词&#xff0c;比如名词&#xff0c;这种词性叫做开放式词性。另外一些词性中的词比較固定&#xff0c;比如…

MVCC浅析(转)

在并发读写数据库时&#xff0c;读操作可能会不一致的数据&#xff08;脏读&#xff09;。为了避免这种情况&#xff0c;需要实现数据库的并发访问控制&#xff0c;最简单的方式就是加锁访问。由于&#xff0c;加锁会将读写操作串行化&#xff0c;所以不会出现不一致的状态。但…

关于单链表,二叉树,图,查找和排序的软件编程

课程名称&#xff1a;计算机软件 使用软件&#xff1a;devcpp 注意&#xff1a;这里列出了关于单链表&#xff0c;二叉树&#xff0c;图&#xff0c;查找和排序的编程&#xff0c;全部程序由博主一人编写&#xff0c;会有瑕疵&#xff0c;谨慎使用。 1.单链表 要求&#xff1a;…