leetcode 664. 奇怪的打印机(dp)
题目
有台奇怪的打印机有以下两个特殊要求:
打印机每次只能打印由 同一个字符 组成的序列。
每次可以在任意起始和结束位置打印新字符,并且会覆盖掉原来已有的字符。
给你一个字符串 s ,你的任务是计算这个打印机打印它需要的最少打印次数。
示例 1:
输入:s = “aaabbb”
输出:2
解释:首先打印 “aaa” 然后打印 “bbb”。
示例 2:
输入:s = “aba”
输出:2
解释:首先打印 “aaa” 然后在第二个位置打印 “b” 覆盖掉原来的字符 ‘a’。
解题思路
数组含义
这题的数组的含义应该很容易就看得出来:dp[i][j]代表子串s[i,j]的最少打印次数
状态转移
例如字符串"aba"在计算dp[i][j]=dp[0][2]时,
遍历r(i=<r<=j-1),检查s[r]==s[j],如果s[r]=s[j]的话,就是说明了可能有一种情况是:
先打印子串s[i…j],然后再将子串s[r+1…j-1]覆盖掉,所以状态转移方程就是 dp[i][j]= Math.min(dp[i][j],dp[i][r]+dp[r+1][j-1]);
- 第一步时,打印子串s[i…j]的最少打印次数dp[i][r],因为第一步时,子串s[r+1,j]里面的所有元素都是等于s[r]的(结合题目条件:打印机每次只能打印由 同一个字符组成的序列和s[r]=s[j]可得),所以dp[i][j]=dp[r+1][j]是成立的
- 第二步时,将子串s[r+1…j-1]进行打印然后覆盖在第一步的结果上,因此第二步的打印次数就是dp[r+1][j-1]
将两步的打印次数相加,就是这种情况下的打印次数
初始化
dp[i][i]直接初始化为1,因为一个字符只需要一次打印,其他还没填充的元素均置为最大值。
代码
class Solution {public int strangePrinter(String s) {int[][] dp = new int[n + 1][n + 1];for (int i = 0; i < n; i++) Arrays.fill(dp[i],Integer.MAX_VALUE);for (int i = 0; i < n; i++) dp[i][i]=1;for (int i = n-1; i >=0; i--) {for (int j = i+1; j < n; j++) {char cur = s.charAt(j);if (cur==s.charAt(j-1))dp[i][j]=dp[i][j-1];else {dp[i][j]=dp[i][j-1]+1; for (int r=j-2;r>=i;r--){if(cur!=s.charAt(r)) continue;dp[i][j]= Math.min(dp[i][j],dp[i][r]+dp[r+1][j-1]);}}}}return dp[0][n-1];}
}
结果
leetcode 664. 奇怪的打印机(dp)相关推荐
- Java实现 LeetCode 664 奇怪的打印机(DFS)
664. 奇怪的打印机 有台奇怪的打印机有以下两个特殊要求: 打印机每次只能打印同一个字符序列. 每次可以在任意起始和结束位置打印新字符,并且会覆盖掉原来已有的字符. 给定一个只包含小写英文字母的字符 ...
- LeetCode 664. 奇怪的打印机(区间DP)
文章目录 1. 题目 2. 解题 1. 题目 有台奇怪的打印机有以下两个特殊要求: 打印机每次只能打印由 同一个字符 组成的序列. 每次可以在任意起始和结束位置打印新字符,并且会覆盖掉原来已有的字符. ...
- 奇怪的打印机java
有台奇怪的打印机有以下两个特殊要求: 打印机每次只能打印由 同一个字符 组成的序列. 每次可以在任意起始和结束位置打印新字符,并且会覆盖掉原来已有的字符. 给你一个字符串 s ,你的任务是计算这个打印 ...
- 644.奇怪的打印机(困难)
题目: 有台奇怪的打印机有以下两个特殊要求: 打印机每次只能打印由 同一个字符 组成的序列. 每次可以在任意起始和结束位置打印新字符,并且会覆盖掉原来已有的字符. 给你一个字符串 s,你的任务是计算这 ...
- 【冰爪编程】LintCode 解码大全 —— 1100 奇怪的打印机
[冰爪编程]LintCode 解码大全 -- 1100 奇怪的打印机 作者:BZIClaw 1100 奇怪的打印机 Python: class Solution:"""@ ...
- 【数据结构与算法】之深入解析“奇怪的打印机”的求解思路与算法示例
一.题目要求 有台奇怪的打印机有以下两个特殊要求: 打印机每次只能打印由同一个字符组成的序列: 每次可以在从起始到结束的任意位置打印新字符,并且会覆盖掉原来已有的字符. 给你一个字符串 s,你的任务是 ...
- LeetCode 85. 最大矩形(DP/单调递增栈,难)
文章目录 1. 题目 2. 解题 2.1 DP 2.2 单调递增栈 1. 题目 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例: 输入: [[" ...
- LeetCode 221. 最大正方形(DP)
文章目录 1. 题目信息 2. 解题 1. 题目信息 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积. 示例: 来源:力扣(LeetCode) 链接:https:/ ...
- LeetCode 1105. 填充书架(DP)
文章目录 1. 题目 2. 解题 1. 题目 附近的家居城促销,你买回了一直心仪的可调节书架,打算把自己的书都整理到新的书架上. 你把要摆放的书 books 都整理好,叠成一摞:从上往下,第 i 本书 ...
最新文章
- java 导出excel 注解_Java基于注解和反射导入导出Excel
- AI 与区块链:两大热门技术,会碰撞出什么样的火花?
- 自学机器学习、深度学习、人工智能的学习资源集合
- Hibernate主键生成策略总结(这里面讲的很详细)
- c语言使用正则,C语言中使用正则表达式
- robot framework好的学习网址
- gbk转utf-8 iconv 编码转换
- 基于struts2的web系统中的返回功能
- AutoCAD打印设置
- phpstorm 正则匹配搜索_phpstorm 有哪些奇技淫巧?
- AOSP>设计>测试>(第三节)兼容性测试套件CTS
- 《JavaScript设计模式》初次笔记——wsdchong
- html下拉折叠菜单,纯CSS实现折叠菜单下拉菜单
- android系统分区刷机包,安卓刷机最大最专业最齐全的安卓ROM刷机包资源
- 写代码的时候图片显示不出来怎么办?
- Mit6.824-lab3a-2022
- 趣头条老是旧闻重复,怎么处理 | 伪原创视频需要改什么
- 移动端二三事【五】:陀螺仪(重力感应器)实现手机位置、加速度感应以及常见应用。
- LPC1768 IAR环境下使用完整64K内存的方法
- 【Python 百炼成钢】进制转换、特殊回文数、水仙花数、杨辉三角、字母图形、01字符串、回形取数、排他方数、世纪末的星期日、约瑟夫环