题目:

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

示例:

解题思路:

最值问题首先想到动态规划。
定义一个dp[i][j]表示打印i到j所有字符需要的最少次数。
情况一:如果s.charAt(i)==s.charAt(j),说明打印i字符时可以顺带打印j字符,反过来说也是一样的。 这种情况不会增加次数。即dp[i][j] = dp[i+1][j]或者dp[i][j-1]。
情况二:如果字符串两端不相等,s.charAt(i)!=s.charAt(j),这时说明i和j位置的字符是无法同时打印的。我们默认是这种情况,认为dp[i][j]=dp[i+1][j]+1或dp[i][j-1]+1。
但是情况二里面可能出现两端字符与中间某一个字符相同也不会造成多一次的可能性。这个时候需要分段处理,如果i<k<j,其中s[i]==s[k]或者s[j]==s[k],那么dp[i][j] = dp[i][k]+dp[k+1][j]或者dp[i][j]=dp[i][k-1]+dp[k][j]。然后划分为一个两端相同一个两端不同的分别按照情况1和情况2来处理。
以上就是分析过程,但是按照这个思路我没法动手写代码,对现在的我还是太难了。看一下大佬的思路吧,比较清晰。希望我上面的思维过程对看懂下面的解法有帮助。

参考思路:

参考:

宫水三叶644.奇怪的打印机
Java代码

//这是我按照宫水三叶大佬的解法写的,变化就是我最终想返回dp[1][n],大佬返回dp[0][n-1]
//在内循环里面我是从右到左,大佬是从左到右
class Solution {public int strangePrinter(String s) {int n = s.length();int[][] res = new int[n+1][n+1];for(int len = 1;len<=n;len++){for(int lef = 1;lef+len-1<=n;lef++){int rig = lef+len-1;res[lef][rig] = res[lef][rig-1]+1;for(int k = rig-1;k>=lef;k--){if(s.charAt(rig-1)==s.charAt(k-1)){res[lef][rig] = Math.min(res[lef][rig],res[lef][k-1]+res[k+1][rig]);}}}}return res[1][n];}
}

复杂度分析:
时间复杂度是O(n3),空间复杂度O(n2)。
时间:长度遍历是n,第二层左端点选值也是n,第三个选分割点跟前面两层有关联,也可以算成n,最终时间就是3次方。空间用了一个二维的数组所以是2次方。

644.奇怪的打印机(困难)相关推荐

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

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

  2. leetcode 664. 奇怪的打印机(dp)

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

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

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

  4. 奇怪的打印机java

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

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

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

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

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

  7. 如何学好C语言--你的学渣朋友告诉你

    光说不练假把式,光练不说傻把式,又练又说真把式. 真实感受,不是我不想学,是我真的不知道我哪里不会啊和得怎么做啊?本文作者当初就是这么废掉的 推荐两个练习的网站 (一)C语言网 https://www ...

  8. Win10安装打印机驱动搜索不到打印机

    很奇怪,打印机IP能ping通,但是安装驱动的时候就是搜索不到. 之前电脑里装过这个打印机,但是每次打印在我的电脑上都显示成功,但是却在打印机上看不到任务.打印失败. 无奈,准备重新安装打印机驱动(老 ...

  9. C#LeetCode刷题-深度优先搜索

    深度优先搜索篇 # 题名 刷题 通过率 难度 98 验证二叉搜索树 22.2% 中等 99 恢复二叉搜索树 45.1% 困难 100 相同的树 48.1% 简单 101 对称二叉树 42.1% 简单 ...

最新文章

  1. redis 内存不足 排查_一文深入了解 Redis 内存模型,Redis 的快是有原因的!
  2. [html] 请使用canvas画一个椭圆
  3. linux 脚本在哪里编写,Linux 脚本编写基础(一)
  4. 2021年中国超轻型直升机市场趋势报告、技术动态创新及2027年市场预测
  5. Express 入门
  6. 经典中的博弈:第一章 C++的Hello,World!
  7. 阿里巴巴的AI“发动机”
  8. word 公式下沉解决
  9. 【Linux 内核】Linux 内核源码结构 ( 下载 Linux 内核源码 | 使用 VSCode 阅读 Linux 内核源码 )
  10. 分享个Duilib中基于wke的浏览器控件
  11. 金蝶移动bos开发教程_金蝶bos
  12. Windows的CMD的NET命令net start , net stop ...
  13. 移植Linux Kernel SM750 驱动到VxWorks 7
  14. 第二个项目前预演,完成了,(第6200小时的时候)
  15. mac 安装commitizen插件报错Parsing JSON at /Users/lin/.czrc for commitizen config failed
  16. 小程序Progress组件介绍
  17. 软件工程经济学期末复习
  18. 在xcode上看不到输出: stepping may behave oddly; variables may not be available
  19. C语言实现总体方差,总体标准差,样本方差,样本标准差
  20. 怎么抓雷电模拟器的包_fiddler+雷电模拟器进行APP抓包(可抓HTTPS)

热门文章

  1. 桂林山水甲天下,阳朔山水甲桂林
  2. 快速傅里叶变换(FFT)的原理及公式
  3. 博客园博客背景图片设置
  4. Java 八大基本数据类型简述
  5. Apriori算法与python实现
  6. 【数据库的备份与还原】
  7. 【数据结构】栈的实现(C语言)
  8. 群、环、域基础与例子
  9. vue项目如何打包部署到后端
  10. 聊聊jvm的内存结构, 以及各种结构的作用