问题描述

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

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

示例 1:

输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]

示例 2:

输入:s = "a"
输出:[["a"]]

提示:

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

解题思路:回溯 + 动态规划预处理

由于需要求出字符串 s 的所有分割方案,因此我们考虑使用搜索 + 回溯的方法枚举所有可能的分割方法并进行判断。

假设我们当前搜索到字符串的第 i个字符,且 s[0…i-1] 位置的所有字符已经被分割成若干个回文串,并且分割结果被放入了答案数组 ans 中,那么我们就需要枚举下一个回文串的右边界 j,使得 s[i…j]是一个回文串。

因此,我们可以从 i 开始,从小到大依次枚举 j。对于当前枚举的 j 值,我们使用动态规划的方法判断 s[i…j] 是否为回文串:如果 s[i…j]是回文串,那么就将其加入答案数组 ans 中,并以 j+1 作为新的 i 进行下一层搜索,并在未来的回溯时将 s[i…j]从 ans 中移除。

如果我们已经搜索完了字符串的最后一个字符,那么就找到了一种满足要求的分割方法。

当我们在判断 s[i…j]是否为回文串时,可以使用leetcode题解5-最长回文子串提供的思路。

dp[i][i] = (s[i]==s[j])   abd dp[i][j]                当j-i<=1时
dp[i][j] = (s[i] == s[j]) and dp[i + 1][j - 1]      当j-i>1时

实现代码

class Solution {public List<List<String>> lists;    //结果集合public List<String> list;       //分割的子串的集合public int n;                   //字符串长度public boolean f [][];          //判断子串是否为回文串public String str;              //目标字符串public List<List<String>> partition(String s) {n=s.length();       str=s;lists=new ArrayList<>();list=new ArrayList<>();f=new boolean[n][n];char []arrStr=s.toCharArray();//填充f数组,判断f[i][j]代表的子串是否是回文子串for(int i=0;i<n;i++){for(int j=0;j<=i;j++){if((i-j)<=1){if(arrStr[i]==arrStr[j]){f[j][i]=true;}}else{if(arrStr[i]==arrStr[j] && f[j+1][i-1]==true){f[j][i]=true;}}}}dfs(0);return lists;}public void dfs(int i){if(i==n){lists.add(new ArrayList<String>(list));return ;}else{//从i开始,从小到大依次枚举j,对于当前枚举的j值,我们使用f数组来判断它是否为回文子串for(int j=i;j<n;j++){//如果是回文子串,那么我们就把其添加到结果集合中,并且以j+1为i继续新的搜索if(f[i][j]==true){list.add(str.substring(i,j+1));dfs(j+1);//搜索完成以后,将s[i,j]移出。list.remove(list.size()-1);}}}}
}

leetcode题解131-分割回文串相关推荐

  1. 【python】一道LeetCode搞懂递归算法!#131分割回文串 #以及刷LeetCode的一点点小心得 [数据结构与算法基础]

    题目:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串.返回 s 所有可能的分割方案. # 示例 输入: "aab" 输出: [["aa",&q ...

  2. LeetCode 131. 分割回文串【字符串,回溯算法】

    131. 分割回文串 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 .返回 s 所有可能的分割方案. 回文串 是正着读和反着读都一样的字符串. 示例 1: 输入:s = &q ...

  3. 131. 分割回文串

    链接:131. 分割回文串 题解:https://leetcode-cn.com/problems/palindrome-partitioning/solution/hui-su-fa-si-lu-y ...

  4. LeetCode-笔记-131. 分割回文串

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

  5. Suzy找到实习了吗 Day27 | 回溯进行中:39. 组合总和,40. 组合总和 II,131.分割回文串

    39. 组合总和 题目 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 , ...

  6. leetcode题解132-分割回文串 II

    问题描述 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文. 返回符合要求的 最少分割次数 . 示例 1: 输入:s = "aab" 输出:1 解释:只需一次分割 ...

  7. LeetCode 131. 分割回文串(回溯)

    文章目录 1. 题目 2. 回溯 1. 题目 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab" 输出: ...

  8. leetcode 131. 分割回文串 思考分析

    题目 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 思考 问题可以分为两个子问题:1.判断回文串2.分割数组 判断回文串 bool isPalin ...

  9. leetcode 131. 分割回文串(dp+回溯)

    给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 .返回 s 所有可能的分割方案. 回文串 是正着读和反着读都一样的字符串. 示例 1: 输入:s = "aab&quo ...

最新文章

  1. Ajax+SpringBoot+Thymeleaf使用中遇到的跳转页面问题
  2. NUnit2.0详细使用方法
  3. 改革以来计算机应用发展总结,计算机应用专业课程改革总结.doc
  4. 2017年总结的前端文章——CSS高级技巧汇总
  5. Python3.x:pip命令安装第三方库,超时处理方案
  6. python socket.error: [Errno 48] Address already in use
  7. RHEL 5基础篇—常见系统启动类故障
  8. 小米5安卓使用微信X5 Blink内核调试
  9. java发送http get请求的两种方式
  10. EDAS投稿出现问题: notembedded: Upload failed: The font Helvetica is not embedded in the file
  11. com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused
  12. Spring AOP(三)之AfterThrowing增强处理
  13. Java是什么?Java能干什么工作?
  14. 外包的水有多深?华为15k+的外包测试岗能去吗?
  15. 好用在线html编辑器,求一款好用的html在线编辑器
  16. qt android刘海屏状态栏,安卓手机刘海屏算抄袭苹果iPhone X吗?真相了
  17. IP地址和子网划分学习笔记
  18. 手把手教你写《雷神》游戏(三)
  19. emq无法启用mysql_EMQ开启mysql认证
  20. 机器学习可视化技术(Towards Data Science)

热门文章

  1. iQOO骑士黑版本四月亮相:搭载骁龙855+12G运存
  2. 2019年第一批重点作品版权保护预警名单公布 都是贺岁档
  3. Android 剪切板
  4. 字符串:2.BF算法(普通模式匹配算法)
  5. chrome 无法抓屏的问题
  6. tcpdump工具编译记录
  7. Java 四种线程池
  8. js正则表达式验证密码
  9. 【flink】Flink 1.12.2 源码浅析 : yarn-per-job模式解析 yarn 提交过程解析
  10. 【Elasticsearch】Elasticsearch 动态模板(Dynamic templates)