1. 题目

地址:https://leetcode.com/problems/palindrome-partitioning/

Given a string s, partition s such that every substring of the partition is a palindrome.

Return all possible palindrome partitioning of s.

Example:

Input: “aab”
Output:
[
[“aa”,“b”],
[“a”,“a”,“b”]
]

2. DFS回溯算法

思路解析:

  1. 从头开始遍历是回文的子字符串,如果是回文有两种选择,要么加入中间结果列表list中,要么不加入list.remove(list.size() - 1);
  2. 回溯算法必须要有退出条件if (start >= s.length()),则添加把中间结果列表list到最终结果列表中resultList
  3. 判断是回文的方法isPal(String s, int l, int r)
package backtracking;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;// https://leetcode.com/problems/palindrome-partitioning/
public class PalindromePartitioning {public static void main(String[] args) {String s = "aab";PalindromePartitioning obj = new PalindromePartitioning();List<List<String>> resultList = obj.partition(s);System.out.println(Arrays.toString(resultList.toArray()));}public List<List<String>> partition(String s) {List<List<String>> resultList = new ArrayList<List<String>>();// dfsdfs(s, 0, resultList, new ArrayList<String>());return resultList;}private void dfs(String s, int start, List<List<String>> resultList, List<String> list) {// exitif (start >= s.length()) {resultList.add(new ArrayList<String>(list));return;}// forfor (int i = start; i < s.length(); i++) {// isPalindromeif (isPal(s, start, i)) {// addlist.add(s.substring(start, i + 1));dfs(s, i + 1, resultList, list);// not addlist.remove(list.size() - 1);}}}private boolean isPal(String s, int l, int r) {while (l < r) {if (s.charAt(l++) != s.charAt(r--)) {return false;}}return true;}
}

3. 动态规划解法

思路解析:

  1. 从左到右遍历字符串s,把前面所有子字符串是回文的解,拼接当前字符。则为最终解。
    这里比较抽象,用s="aab"步骤分解。
    1)最开始results[0] = [[]] ,
    2)当i = 0, left = 0, 字符串"a"是回文,则遍历results[0], 把子列表都添加上字符串"a", 得到results[1] = [["a"]]
  1. i = 1, left = 0,字符串"aa"是回文,则遍历results[0], 把子列表都添加上字符串"aa",得到results[2] = [["aa"]]
    i = 1, left = 1,字符串"a"是回文,则遍历results[1], 把子列表都添加上字符串"a",得到results[2] = [["aa"], ["a", "a"]].
  2. i = 2, left = 0, 字符串"aab"不是回文, 跳过;
    i = 2, left = 1, 字符串"ab"不是回文, 跳过;
    i = 2, left = 2, 字符串"b"是回文, 则遍历results[2], 把子列表都添加上字符串"b",得到results[3] = [["aa","b"], ["a", "a", "b"]].
  3. 最终解就是results[3] = [["aa","b"], ["a", "a", "b"]].
  1. 上一个结果可以作为当前结果的判断依据,比如(i-left <= 1 || pair[left + 1][i - 1])),加快判断速度。这就是动态规划的好处。
public List<List<String>> partitionWithDP(String s) {int len = s.length();List<List<String>>[] results = new List[len + 1];results[0] = new ArrayList<List<String>>();results[0].add(new ArrayList<String>());boolean[][] pair = new boolean[len][len];for (int i = 0; i < len; i++) {results[i + 1] = new ArrayList<List<String>>();for (int left = 0; left <= i; left++) {if (s.charAt(left) == s.charAt(i) && (i-left <= 1 || pair[left + 1][i - 1])) {pair[left][i] = true;String sub = s.substring(left, i + 1);for (List<String> list: results[left]) {List<String> newList = new ArrayList<String>(list);newList.add(sub);results[i + 1].add(newList);}}}}return results[len];
}

4. 下载

https://github.com/zgpeace/awesome-java-leetcode/blob/master/code/LeetCode/src/backtracking/PalindromePartitioning.java

算法:回溯十五 Palindrome Partitioning字符串的字符串为回文所有解集合(2中解法)相关推荐

  1. Java 数据结构和算法(十五):无权无向图

    Java数据结构和算法(十五)--无权无向图 前面我们介绍了树这种数据结构,树是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合,把它叫做"树"是因为它看起 ...

  2. 怎么判断一个字符串的最长回文子串是否在头尾_每日一道算法题,让你的头脑更活跃(寻找最长回文子串)...

    前言 最近准备把算法慢慢的捡起来,所以准备日更一道算法题目,难度自然是由简入难,所以同学们可以每天都来看看小编的更新. 日更时间定在每晚20:00,希望大家多多关注啦. 昨天就欠更了,简直就是打脸.过 ...

  3. 【回文字符串】 最长回文子串O(N) Manacher算法

    原理讲的清晰:Manacher's ALGORITHM: O(n)时间求字符串的最长回文子串 注意: ①动态生命P[]和newStr数组后,不要忘记delete[] //其实这是基本的编码习惯 ②最终 ...

  4. 算法笔记-问题 A: 【字符串】最长回文子串

    问题 A: [字符串]最长回文子串 题目描述 输入一个字符串,求出其中最长的回文子串.子串的含义是:在原串中连续出现的字符串片段.回文的含义是:正着看和倒着看相同.如abba和yyxyy.在判断回文时 ...

  5. 怎么判断一个字符串的最长回文子串是否在头尾_【Leetcode每日打卡】最长回文串...

    干货预警:所有文章都会首发于我的公众号[甜姨的奇妙冒险],欢迎watch. 一.来历: 力扣从3月开始开启了每日一题打卡活动,于是跟风加入了打卡大军,这两天写评论.发题解,没想到反响还不错,收到了来自 ...

  6. 怎么判断一个字符串的最长回文子串是否在头尾_最长回文字串/子序列问题(leetcode5,9,519)

    leetcode 5 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: " ...

  7. 怎么判断一个字符串的最长回文子串是否在头尾_回文自动机入门

    缘起 回文自动机(Palindrome auto machine PAM,有些地方称之为回文树)是回文问题的大杀器~  本文使用一道很简单的题目入门这个精巧的数据结构. hdu 2163 Palind ...

  8. 【某航】A*算法实现十五数码问题--人工智能课程大作业

    代码链接:github代码 1.问题要求 15数码问题是在4×4方格盘上,放有15个数码,剩下一个位置为空(方便起见,用0表示空),每一空格其上下左右的数码可移至空格.本问题给定初始位置和目标位置,要 ...

  9. 斗地主AI算法——第十五章の测试模块

    前面几章已经把整个斗地主AI算法工程完成的差不多了,接下来进入整合联调以及模拟测试模块. 测试模块主要任务就是代替服务器给出我们需要的数据.因为我们本来的计划是封装成类库通过服务器调用获取,其调用的接 ...

  10. 【字符串】最长回文子串 ( 动态规划算法 ) ★

    文章目录 一.回文串.子串.子序列 二.最长回文子串 1.动态规划算法 2.动态规划算法代码示例 一.回文串.子串.子序列 " 回文串 ( Palindrome ) " 是 正反都 ...

最新文章

  1. 添加或者更新字段说明
  2. 应用内评分_游戏评分低,怎么办?
  3. 您对光纤损耗了解多少?知道如何计算吗?
  4. ant构建项目迁移到gradle_自动化构建、自动化部署发布一览
  5. 初识Flink-从WorldCount开始
  6. aspects_具有Aspects的Java中的Mixin –用于Scala特性示例
  7. Java集合:List集合
  8. 3、WordCount源码分析
  9. matlab中用数据拟合圆心,拟合圆并求圆心(matlab)
  10. Data Guard 三种模式解释
  11. java1.8 64位,jdk 1.8 64位 下载_jdk 1.8 64位 官方版_魅蓝下载
  12. 在Linux下群ping脚本,Linux下使用screen和ping命令对网络质量进行监控
  13. MCSA / Windows Server 2016 使用Hyper-V组件搭建实验环境
  14. 微信小程序文档api
  15. 谈canvas转图片的方法(base64编码)
  16. 题目:js实现求100以内的质数
  17. c++,kmin,kmax
  18. 计算机管理内默认共享,Win10共享默认在哪里关闭 清除默认共享哪种方法比较彻底...
  19. vue实现搜索框记录搜索历史_Vue 实现输入框新增搜索历史记录功能
  20. XSS修炼之独孤九剑——笔记

热门文章

  1. fastlane php,[iOS - 自动化] fastlane/frameit
  2. docker 重启gitlab_gitlab从入门到绝望
  3. 从数据库中读取数据,创建XML文件并更新维护XML
  4. linux命令与示例 week 3
  5. codevs1842 递归第一次
  6. ACdream 1728 SJY's First Task
  7. liux环境下配置jdk
  8. oracle参数文件spfile和pfile
  9. android 开启或者隐藏软键盘
  10. 如何去掉桌面图标上的小箭头