`

leetcode打怪升级系列:回文分割 II(132)

 
阅读更多

     通过校内认识的一个google同学,知道了leetcode(http://leetcode.com/onlinejudge)这个IT面试,在线评测网站,同学建议做完leetcode的所有题目,且代码在30-50之间并保证质量,做题时严格控制时间。于是决定从现在起开始leetcode上打怪升级,今天做了第一个题目,叫回文分割,题目地址在这里http://leetcode.com/onlinejudge#question_132。下面说说我的解题过程.

 

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

Return the minimum cuts needed for a palindrome partitioning of s.

For example, given s = "aab",
Return 1 since the palindrome partitioning ["aa","b"] could be produced using 1 cut.

 

   这道题不禁又使我联想起算导DP上矩阵最小连乘次数那道题(已经思维定势了),于是自然而然的就用了那道题的算法,大致思路如下:

 

     假如字符串的长度为n,连续取从2到n之间(包括n)的子串,举个例子:字符串abcd,第一趟循环取长度为2的子串,于是就有ab,bc,cd,第二趟取长度为3的子串,于是就有abc,bcd,最后取长度为4的字串,即abcd,也许你会问取这些子串干什么,因为题目要求使得每个子串为回文的最少截取次数,该问题具有最优子结构特性。

 

       我们可以用反证法证明,假设原字符串分割最小次数的分割方式为 A1|A2|A3,Ai代表分割的子串,这个问题就变成分别求A1,A2,A3三个子串的最小分割次数,假设A1分割方式不是最小分割次数,那么一定存在一种分割方式使A1的分割次数最小,从而使得整个字符串的分割次数最小,这与原始命题矛盾,所以结论是要使原字符串的分割次数最小,那么子串的分割次数必须是最小的。

 

       这样,我们就把大问题化简成小问题,小问题相比更好解决。我用F[i][j]代表原字符串索引第i到j子串分割次数的最小值,那么DP的状态转移方程为:F[i][j]=min{F[i][k]+F[k+1][j]+1,i=<k<j},看到这里也许你还是不明白为什么要取这些子串。

 

       举一个最简单的例子,原始字符串ABC,其最小的分割次数为 ([Str]代表Str的最小分割次数)[A]+[BC]+1,[AB]+[C]+1,[ABC](自身是否是回文串,如果是则该串不用切割,分割次数为0),这些分割方式的最小值,而[BC]=min{[B]+[C]+1,[BC]},[AB]=min{[A]+[B]+1,[AB]},看到了吗,每种长度的子串都用到了。

下面是实现的Java代码:

              

public static int minCut(String s) {
		int len = s.length();
		int[][] F = new int[len][len];//定义二维数组表示状态转移方程
		for (int i = 0; i < len; i++) {
			F[i][i] = 0;
		}
		for (int k = 2; k <= len; k++) {//子串长度从2取到len
			for (int i = 0; i <= len - k; i++) {
				int min = Integer.MAX_VALUE;
				for (int j = i; j < i + k; j++) {//在k长度的子串中取最小值
					if (j == i) {
						int ss = i, ee = i + k - 1;
						if (s.charAt(ss) == s.charAt(ee)&& (ss + 1 == ee || F[ss + 1][ee - 1] == 0)) {//判断是否是回文串
							min = 0;
							break;
						}
					} else {
						if (F[i][j - 1] != 0) {
							continue;
						}
						min = Math.min(F[i][j - 1] + F[j][i + k - 1] + 1, min);
					}
				}
				F[i][i + k - 1] = min;
			}
		}
		return F[0][len - 1];

	}

 

     此算法的时间负责度可见为O(n3),所以只过了leetcode上该题的小数据,大数据一直有一个数据是TLE,所以下面我会给出一个时间复杂度为O(n2)的算法。

 

(时间太晚了,回宿舍了,明天继续)

分享到:
评论

相关推荐

    LeetCode刷题挑战: 回文数

    回文数 LeetCode刷题挑战: 回文数

    leetcode316-Algorithm:算法

    leetcode 316 算法 这是一个算法问题列表。 力码 LeetCode #1:二和 LeetCode #2:两个数字相加 LeetCode #5:最长回文子串 力扣#15:3Sum LeetCode #20:有效括号 LeetCode #21:合并两个排序列表 LeetCode #24:成...

    c语言leetcode题解之第132题分割回文串II.zip

    c语言 c语言leetcode题解之第132题分割回文串II

    [LeetCode]每日一题009:回文数题解.docx

    本文将详细讲解 LeetCode 中的第 009 题:回文数题解。该题目要求判断一个整数是否为回文数,即正序和倒序读都是一样的整数。 从题描述中可以看到,回文数的定义是指一个整数在正序和倒序读都是一样的数字。例如,...

    python-leetcode面试题解之第132题分割回文串II-题解.zip

    在本压缩包中,我们关注的是一个Python编程与算法相关的主题,特别地是关于LeetCode面试题中的第132题“分割回文串II”。LeetCode是一个热门的在线平台,程序员在这里练习和提升自己的算法技能,特别是对于准备求职...

    leetcode分类-leetcode::pencil:锻炼思维,Issue中不定时更新

    leetcode 分类 LeetCode :bouquet::bouquet::bouquet: 介绍 leetcode 题解,Issues 会记录 leetcode 解题之路,并使用 label 进行了分类。 目录 链表

    leetcode卡-leetcode-python::dizzy:Python版LeetCode:snake:

    leetcode卡 :dizzy: LeetCode for Python :snake: Requirements Python &gt;= 3.8 Installation git clone git@github.com:imajinyun/leetcode-python.git cd leetcode-python Usage python3 -m unittest discover -s ....

    leetcode跳跃-Leetcode:chifan

    leetcode 跳跃 算法分类 1 基础算法 排序 快速排序: 快速排序 找到第K个数 归并排序: 归并排序 逆序对的数量 堆排序: 二分 整数二分: 数组二分: 高精度 * 高精度加法 高精度减法 高精度乘法 高精度除法 前缀和&...

    c语言leetcode题解之第131题分割回文串.zip

    c语言 c语言leetcode题解之第131题分割回文串

    gasstationleetcode-leetcode:简单纪录每日一题

    leetcode 非官方顺序leetcode题解,主要代码为Python和C++。 leetcode 第1题: leetcode 第2题: leetcode 第3题: leetcode 第4题: leetcode 第5题: leetcode 第6题: leetcode 第7题: leetcode 第9题: ...

    [宫水三叶的刷题日记]:回文串问题1

    例如,LeetCode上的第5题——"最长回文子串",难度为中等,主要考察的是回文串的识别和搜索。这个问题可以通过两种方法来解决:朴素解法和Manacher算法。 **朴素解法**: 朴素解法通常是最直观但效率较低的解题策略...

    leetcode11-leetcode:leetcode实现源代码

    leetcode11 top 1. 位运算 LeetCode191 : 二进制位1的个数 LeetCode338 : 比特位运算 2. 字典树 LeetCode209 : 实现一个Trie结构 LeetCode79 : 单词搜索(判断单词是否出现在给定的网格中) LeetCode212 : 单词搜索II...

    leetcode530-leetcodeChyi::sparkles::memo:leetcode:memo::sparkles:

    leetcode 530 :pencil: 使用 Python3,Cpp 的 Leetcode 解决方案 更新时间:2018-02-27 19:05:41 自动创建 我已经解决了1 / 706 个问题,但仍有132 个问题被锁定。 如果你想使用这个工具,请按照这个 如果您有任何...

    leetcode题库-LeetCode:LeetCode打怪经历

    这个“leetcode题库-LeetCode:LeetCode打怪经历”压缩包文件很可能包含了一位用户在刷LeetCode题目的过程记录,包括笔记、解题思路和可能的代码实现。 在LeetCode上,你可以找到各种难度级别的问题,涵盖二分查找、...

    leetcode中文版-LeetCode-Solution-PPT:我给LeetCode中文版制作的题解PPT

    leetcode中文版 LeetCode-Solution-PPT 刷题过程中在 LeetCode 中文版提交的题解和动画 LeetCode 第 23 题:合并 K 个排序链表 题解地址: LeetCode 第 41 题:缺失的第一个正数 题解地址: LeetCode 第 60 题:第 k...

    leetcode中国-leetcode::tangerine:leetcode练习

    leetcode中国 :tangerine: 力码 我的 LeetCode 练习记录。 可以使用 javascript 来解决它们:) :compass: 目录 二分搜索算法 题目 难度 解法 简单的 简单的 简单的 简单的 简单的 简单的 简单的 :open_book: 学习资料...

    python-leetcode题解之第680题验证回文串II

    python python_leetcode题解之第680题验证回文串II

    Waldenth#My-LeetCode##5 最长回文子串1

    3 初始值和特殊情况由于常规情况要求$$j-1\geq i+1$$,所以字符串只有两个字母或者一个字母的情况要特殊考虑一个字母的情况,肯定是回文串:两个字母的情

    vscode安装leetcode-palindromeC-:回文C-

    vscode安装leetcode 回文 这是分支、循环和其他基本 C# 概念的练习,以构建工作控制台应用程序。5/5/2020 由 Nitun Dtta 和 Matt Stroud 制作 描述 这是一个控制台应用程序,允许用户提供任何单词、短语、数字或其他...

Global site tag (gtag.js) - Google Analytics