题目

有台奇怪的打印机有以下两个特殊要求:

打印机每次只能打印由 同一个字符 组成的序列。
每次可以在任意起始和结束位置打印新字符,并且会覆盖掉原来已有的字符。
给你一个字符串 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]);

  1. 第一步时,打印子串s[i…j]的最少打印次数dp[i][r],因为第一步时,子串s[r+1,j]里面的所有元素都是等于s[r]的(结合题目条件:打印机每次只能打印由 同一个字符组成的序列和s[r]=s[j]可得),所以dp[i][j]=dp[r+1][j]是成立的
  2. 第二步时,将子串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)相关推荐

  1. Java实现 LeetCode 664 奇怪的打印机(DFS)

    664. 奇怪的打印机 有台奇怪的打印机有以下两个特殊要求: 打印机每次只能打印同一个字符序列. 每次可以在任意起始和结束位置打印新字符,并且会覆盖掉原来已有的字符. 给定一个只包含小写英文字母的字符 ...

  2. LeetCode 664. 奇怪的打印机(区间DP)

    文章目录 1. 题目 2. 解题 1. 题目 有台奇怪的打印机有以下两个特殊要求: 打印机每次只能打印由 同一个字符 组成的序列. 每次可以在任意起始和结束位置打印新字符,并且会覆盖掉原来已有的字符. ...

  3. 奇怪的打印机java

    有台奇怪的打印机有以下两个特殊要求: 打印机每次只能打印由 同一个字符 组成的序列. 每次可以在任意起始和结束位置打印新字符,并且会覆盖掉原来已有的字符. 给你一个字符串 s ,你的任务是计算这个打印 ...

  4. 644.奇怪的打印机(困难)

    题目: 有台奇怪的打印机有以下两个特殊要求: 打印机每次只能打印由 同一个字符 组成的序列. 每次可以在任意起始和结束位置打印新字符,并且会覆盖掉原来已有的字符. 给你一个字符串 s,你的任务是计算这 ...

  5. 【冰爪编程】LintCode 解码大全 —— 1100 奇怪的打印机

    [冰爪编程]LintCode 解码大全 -- 1100 奇怪的打印机 作者:BZIClaw 1100 奇怪的打印机 Python: class Solution:"""@ ...

  6. 【数据结构与算法】之深入解析“奇怪的打印机”的求解思路与算法示例

    一.题目要求 有台奇怪的打印机有以下两个特殊要求: 打印机每次只能打印由同一个字符组成的序列: 每次可以在从起始到结束的任意位置打印新字符,并且会覆盖掉原来已有的字符. 给你一个字符串 s,你的任务是 ...

  7. LeetCode 85. 最大矩形(DP/单调递增栈,难)

    文章目录 1. 题目 2. 解题 2.1 DP 2.2 单调递增栈 1. 题目 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例: 输入: [[" ...

  8. LeetCode 221. 最大正方形(DP)

    文章目录 1. 题目信息 2. 解题 1. 题目信息 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积. 示例: 来源:力扣(LeetCode) 链接:https:/ ...

  9. LeetCode 1105. 填充书架(DP)

    文章目录 1. 题目 2. 解题 1. 题目 附近的家居城促销,你买回了一直心仪的可调节书架,打算把自己的书都整理到新的书架上. 你把要摆放的书 books 都整理好,叠成一摞:从上往下,第 i 本书 ...

最新文章

  1. java 导出excel 注解_Java基于注解和反射导入导出Excel
  2. AI 与区块链:两大热门技术,会碰撞出什么样的火花?
  3. 自学机器学习、深度学习、人工智能的学习资源集合
  4. Hibernate主键生成策略总结(这里面讲的很详细)
  5. c语言使用正则,C语言中使用正则表达式
  6. robot framework好的学习网址
  7. gbk转utf-8 iconv 编码转换
  8. 基于struts2的web系统中的返回功能
  9. AutoCAD打印设置
  10. phpstorm 正则匹配搜索_phpstorm 有哪些奇技淫巧?
  11. AOSP>设计>测试>(第三节)兼容性测试套件CTS
  12. 《JavaScript设计模式》初次笔记——wsdchong
  13. html下拉折叠菜单,纯CSS实现折叠菜单下拉菜单
  14. android系统分区刷机包,安卓刷机最大最专业最齐全的安卓ROM刷机包资源
  15. 写代码的时候图片显示不出来怎么办?
  16. Mit6.824-lab3a-2022
  17. 趣头条老是旧闻重复,怎么处理 | 伪原创视频需要改什么
  18. 移动端二三事【五】:陀螺仪(重力感应器)实现手机位置、加速度感应以及常见应用。
  19. LPC1768 IAR环境下使用完整64K内存的方法
  20. 【Python 百炼成钢】进制转换、特殊回文数、水仙花数、杨辉三角、字母图形、01字符串、回形取数、排他方数、世纪末的星期日、约瑟夫环

热门文章

  1. C++11新特性之八——函数对象function
  2. (C++版)链表(三)——实现双向链表的创建、插入、删除等简单操作
  3. 阿里P7大牛整理!BAT大厂面试基础题集合,成功入职字节跳动
  4. Python小数据池,代码块
  5. 【原创】数据库中为什么不推荐使用外键约束
  6. 网络对抗技术作业一 201421410031
  7. JavaWeb项目前端规范(采用命名空间使js深度解耦合)
  8. 30.Android之百度地图简单学习
  9. 常见算法及问题场景——图
  10. 带标题的图片轮询展示