热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LeetCode:131.PalindromePartitioning

LeetCode:131.PalindromePartitioningI’mcomeback!从今天开始,争取每天刷一道LeetCode,并写一篇相应的

LeetCode: 131. Palindrome Partitioning

I’m come back ! 从今天开始,争取每天刷一道 LeetCode,并写一篇相应的题解。


题目描述

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"]
]

解题思路 —— 动态规划构建回文表格, 深度优先搜索构建 palindrome partitioning


动态规划构建回文表格(bPalindromes)

利用动态规划, 将给定字符串 s 中的回文子串识别出来,具体操作如下。
1. 定义。记, bPalindromes[i][j] 为字符串 s 在区间 [i, j) 的子串为回文串的真值性。如,s = aabaa 时, bPalindromes[1][4] = true, bPalindromes[1][3] = false
2. 初始化。空串 bPalindromes[i][i] 和 单字符串 bPalindromes[i][i+1] 为回文串。
3. 状态转移方程s 串在 [i, j) 区间的子串是回文串的充要条件是:s 串在 [i+1, j-1) 区间的子串是回文串, 且 s[i] == s[j-1]。即:bPalindromes[i][j] = (bPalindromes[i+1][j-1] && s[i] == s[j-1])
4. 例子。 当 s = aabaa 时,
(0)s 字符串:
s字符串
(1)初始化后的回文表格 bPalindromes:
初始化
(2) 状态转移后的回文表格:
状态转移

深度优先搜索构建 palindrome partitioning

根据回文表格记录的回文子串信息,深度优先搜索能拼凑出 s 串的回文子串的所有可能。

AC 代码

class Solution {
private:// 根据待处理字符串 s 构造回文表格&#xff08;bPalindromes&#xff09;void ConstructPalindromesTable(vector<vector<bool>>& bPalindromes, const string& s){ // initializing...bPalindromes.resize(s.size()&#43;1);for(size_t i &#61; 0; i 1; &#43;&#43;i){bPalindromes[i].resize(s.size()&#43;1, false);}// s 串中的单个字符 [i, i&#43;1) 一定是回文的// 定义空串 [i, i&#xff09; 也是回文的for(size_t i &#61; 0; i 1] &#61; true;bPalindromes[i][i] &#61; true;}for(size_t j &#61; 1; j 1; &#43;&#43;j){for(size_t i &#61; 0; i // [i, j) 是回文串的充要条件: [i&#43;1, j-1) 是回文串&#xff0c;且 s[i] &#61;&#61; s[j-1]if(bPalindromes[i&#43;1][j-1] &#61;&#61; true && s[i] &#61;&#61; s[j-1]){bPalindromes[i][j] &#61; true;}}}}// 根据回文表格(bPalindromes)构造 “all possible palindrome partitioning of s”void ConstructPalindromes(const vector<vector<bool>>& bPalindromes, const string& s,vector<vector<string>>& palindromes,vector<string>& curPalindrome, int curState){if(curState >&#61; bPalindromes.size()-1){if(!curPalindrome.empty()) palindromes.push_back(curPalindrome);return;}for(int nextState &#61; curState&#43;1; nextState if(bPalindromes[curState][nextState] &#61;&#61; true){curPalindrome.push_back(s.substr(curState, nextState-curState));ConstructPalindromes(bPalindromes, s, palindromes, curPalindrome, nextState);curPalindrome.pop_back();}}}
public:vector<vector<string>> partition(string s) {if(s.empty()) return {{}};// bPalindromes[i][j]: s 串的 [i, j) 区间是回文 vector<vector<bool>> bPalindromes; // 构造回文表格ConstructPalindromesTable(bPalindromes, s);// 构造解vector<vector<string>> palindromes;vector<string> curPalindrome;ConstructPalindromes(bPalindromes, s, palindromes, curPalindrome, 0);return palindromes;}
};


推荐阅读
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 学习Java异常处理之throws之抛出并捕获异常(9)
    任务描述本关任务:在main方法之外创建任意一个方法接收给定的两个字符串,把第二个字符串的长度减1生成一个整数值,输出第一个字符串长度是 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 求数组中字符串的最长公共前缀(Java)
    求数组中字符串的最长公共前缀(牛客网—牛客题霸算法篇—NC55)题目描述给你一个大小为n的字符串数组strs,其中包含n个字符串,编写一个函数来查找字符串数组中的最长公共前缀,返回 ... [详细]
  • 【论文】ICLR 2020 九篇满分论文!!!
    点击上方,选择星标或置顶,每天给你送干货!阅读大概需要11分钟跟随小博主,每天进步一丢丢来自:深度学习技术前沿 ... [详细]
  • 包含A-Z的字母的消息通过以下规则编码:'A'-1'B'-2'Z'-26给定一个包含数字的编码消息,请确定解 ... [详细]
  • Birthdate ... [详细]
author-avatar
美娟婉燕6386
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有