题目链接
英文链接:https://leetcode.com/problems/strange-printer/
中文链接:https://leetcode-cn.com/problems/strange-printer/
题目详述
有台奇怪的打印机有以下两个特殊要求:
打印机每次只能打印同一个字符序列。
每次可以在任意起始和结束位置打印新字符,并且会覆盖掉原来已有的字符。
给定一个只包含小写英文字母的字符串,你的任务是计算这个打印机打印它需要的最少次数。
示例 1:
1 | 输入: "aaabbb" |
示例 2:
1 | 输入: "aba" |
提示: 输入字符串的长度不会超过 100。
题目详解
动态规划。
f[i][j]
表示区间s[i, j]
的最少打印次数。- 对于
f[i][j]
,状态转移如下:- 第一种:最差的情况下,
s[i]
单独打印,则f[i][j] = 1 + f[i + 1][j];
。 - 第二种:如果
s[i] == s[k], i+ 1 <= k <= j
,那么f[i][j] = min{f[i][j], f[i + 1][k] + f[k + 1][j]}
,表示将s[i]
与s[i + 1][k]
一起打印,f[k + 1][j]
代表s[k + 1, j]
另外打印。需要注意的是s[i] == s[j]
时,f[k + 1][j]
越界了,所以数组要多开一位。
- 第一种:最差的情况下,
- 初始情况,
f[i][i] = 1
,表示单个字符打印一次。
1 | public class LeetCode_00664 { |