算法:回溯十五 Palindrome Partitioning字符串的字符串为回文所有解集合(2中解法)
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回溯算法
思路解析:
- 从头开始遍历是回文的子字符串,如果是回文有两种选择,要么加入中间结果列表
list
中,要么不加入list.remove(list.size() - 1);
。 - 回溯算法必须要有退出条件
if (start >= s.length())
,则添加把中间结果列表list
到最终结果列表中resultList
。 - 判断是回文的方法
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. 动态规划解法
思路解析:
- 从左到右遍历字符串
s
,把前面所有子字符串是回文的解,拼接当前字符。则为最终解。
这里比较抽象,用s="aab"
步骤分解。
1)最开始results[0] = [[]]
,
2)当i = 0, left = 0
, 字符串"a"
是回文,则遍历results[0]
, 把子列表都添加上字符串"a"
, 得到results[1] = [["a"]]
。
- 当
i = 1, left = 0
,字符串"aa"
是回文,则遍历results[0]
, 把子列表都添加上字符串"aa"
,得到results[2] = [["aa"]]
;
当i = 1, left = 1
,字符串"a"
是回文,则遍历results[1]
, 把子列表都添加上字符串"a"
,得到results[2] = [["aa"], ["a", "a"]]
. - 当
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"]]
. - 最终解就是
results[3] = [["aa","b"], ["a", "a", "b"]]
.
- 上一个结果可以作为当前结果的判断依据,比如
(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中解法)相关推荐
- Java 数据结构和算法(十五):无权无向图
Java数据结构和算法(十五)--无权无向图 前面我们介绍了树这种数据结构,树是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合,把它叫做"树"是因为它看起 ...
- 怎么判断一个字符串的最长回文子串是否在头尾_每日一道算法题,让你的头脑更活跃(寻找最长回文子串)...
前言 最近准备把算法慢慢的捡起来,所以准备日更一道算法题目,难度自然是由简入难,所以同学们可以每天都来看看小编的更新. 日更时间定在每晚20:00,希望大家多多关注啦. 昨天就欠更了,简直就是打脸.过 ...
- 【回文字符串】 最长回文子串O(N) Manacher算法
原理讲的清晰:Manacher's ALGORITHM: O(n)时间求字符串的最长回文子串 注意: ①动态生命P[]和newStr数组后,不要忘记delete[] //其实这是基本的编码习惯 ②最终 ...
- 算法笔记-问题 A: 【字符串】最长回文子串
问题 A: [字符串]最长回文子串 题目描述 输入一个字符串,求出其中最长的回文子串.子串的含义是:在原串中连续出现的字符串片段.回文的含义是:正着看和倒着看相同.如abba和yyxyy.在判断回文时 ...
- 怎么判断一个字符串的最长回文子串是否在头尾_【Leetcode每日打卡】最长回文串...
干货预警:所有文章都会首发于我的公众号[甜姨的奇妙冒险],欢迎watch. 一.来历: 力扣从3月开始开启了每日一题打卡活动,于是跟风加入了打卡大军,这两天写评论.发题解,没想到反响还不错,收到了来自 ...
- 怎么判断一个字符串的最长回文子串是否在头尾_最长回文字串/子序列问题(leetcode5,9,519)
leetcode 5 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: " ...
- 怎么判断一个字符串的最长回文子串是否在头尾_回文自动机入门
缘起 回文自动机(Palindrome auto machine PAM,有些地方称之为回文树)是回文问题的大杀器~ 本文使用一道很简单的题目入门这个精巧的数据结构. hdu 2163 Palind ...
- 【某航】A*算法实现十五数码问题--人工智能课程大作业
代码链接:github代码 1.问题要求 15数码问题是在4×4方格盘上,放有15个数码,剩下一个位置为空(方便起见,用0表示空),每一空格其上下左右的数码可移至空格.本问题给定初始位置和目标位置,要 ...
- 斗地主AI算法——第十五章の测试模块
前面几章已经把整个斗地主AI算法工程完成的差不多了,接下来进入整合联调以及模拟测试模块. 测试模块主要任务就是代替服务器给出我们需要的数据.因为我们本来的计划是封装成类库通过服务器调用获取,其调用的接 ...
- 【字符串】最长回文子串 ( 动态规划算法 ) ★
文章目录 一.回文串.子串.子序列 二.最长回文子串 1.动态规划算法 2.动态规划算法代码示例 一.回文串.子串.子序列 " 回文串 ( Palindrome ) " 是 正反都 ...
最新文章
- 添加或者更新字段说明
- 应用内评分_游戏评分低,怎么办?
- 您对光纤损耗了解多少?知道如何计算吗?
- ant构建项目迁移到gradle_自动化构建、自动化部署发布一览
- 初识Flink-从WorldCount开始
- aspects_具有Aspects的Java中的Mixin –用于Scala特性示例
- Java集合:List集合
- 3、WordCount源码分析
- matlab中用数据拟合圆心,拟合圆并求圆心(matlab)
- Data Guard 三种模式解释
- java1.8 64位,jdk 1.8 64位 下载_jdk 1.8 64位 官方版_魅蓝下载
- 在Linux下群ping脚本,Linux下使用screen和ping命令对网络质量进行监控
- MCSA / Windows Server 2016 使用Hyper-V组件搭建实验环境
- 微信小程序文档api
- 谈canvas转图片的方法(base64编码)
- 题目:js实现求100以内的质数
- c++,kmin,kmax
- 计算机管理内默认共享,Win10共享默认在哪里关闭 清除默认共享哪种方法比较彻底...
- vue实现搜索框记录搜索历史_Vue 实现输入框新增搜索历史记录功能
- XSS修炼之独孤九剑——笔记