当前位置: 首页 > news >正文

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

相关文章:

  • Uniapp + Vue3 封装请求工具挂载全局
  • windows平台配置vsCode_CMake_Clang/LLVM_ninja环境与测试
  • 堆与二叉树(下)
  • 深度学习 | 基础卷积神经网络
  • 智能优化算法应用:基于蛇优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码
  • C语言沉浸式刷题【C语言必刷题】
  • rk3588 之启动
  • 初识QT(上篇):What Qt
  • 【顶级快刊】IEEE(Trans),审稿快仅2个月录用,入选CCF-B,现在投最快!
  • ZKP Mathematical Building Blocks (2)
  • Spring MVC 方法中添加参数、HttpServletRequest 和 HttpServletResponse 对象
  • Netty-4-网络编程模式
  • 【clickhouse】在CentOS中离线安装clickhouse
  • 代码随想录算法训练营 | day60 单调栈 84.柱状图中最大的矩形
  • 每日一题(LeetCode)----栈和队列--滑动窗口最大值
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • conda常用的命令
  • golang 发送GET和POST示例
  • HTTP--网络协议分层,http历史(二)
  • interface和setter,getter
  • Javascript基础之Array数组API
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • laravel5.5 视图共享数据
  • Linux gpio口使用方法
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • React中的“虫洞”——Context
  • Redis的resp协议
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • vue数据传递--我有特殊的实现技巧
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 和 || 运算
  • 技术胖1-4季视频复习— (看视频笔记)
  • 入门到放弃node系列之Hello Word篇
  • 项目实战-Api的解决方案
  • 进程与线程(三)——进程/线程间通信
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​2021半年盘点,不想你错过的重磅新书
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • (4)事件处理——(7)简单事件(Simple events)
  • (6)STL算法之转换
  • (C++17) optional的使用
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (二十四)Flask之flask-session组件
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (汇总)os模块以及shutil模块对文件的操作
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (十五)Flask覆写wsgi_app函数实现自定义中间件