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]);

  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];}
}

结果

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/390824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL数据类型说明和MySQL语法示例

SQL数据类型 (SQL Data Types) Each column in a database table is required to have a name and a data type. 数据库表中的每一列都必须具有名称和数据类型。 An SQL developer must decide what type of data that will be stored inside each column when creating a tab…

PHP7.2 redis

为什么80%的码农都做不了架构师&#xff1f;>>> PHP7.2 的redis安装方法&#xff1a; 顺便说一下PHP7.2的安装&#xff1a; wget http://cn2.php.net/distributions/php-7.2.4.tar.gz tar -zxvf php-7.2.4.tar.gz cd php-7.2.4./configure --prefix/usr/local/php…

leetcode 1787. 使所有区间的异或结果为零

题目 给你一个整数数组 nums​​​ 和一个整数 k​​​​​ 。区间 [left, right]&#xff08;left < right&#xff09;的 异或结果 是对下标位于 left 和 right&#xff08;包括 left 和 right &#xff09;之间所有元素进行 XOR 运算的结果&#xff1a;nums[left] XOR n…

【JavaScript】网站源码防止被人另存为

1、禁示查看源代码 从"查看"菜单下的"源文件"中同样可以看到源代码&#xff0c;下面我们就来解决这个问题&#xff1a; 其实这只要使用一个含有<frame></frame>标记的网页便可以达到目的。 <frameset> <frame src"你要保密的文件…

梯度 cv2.sobel_TensorFlow 2.0中连续策略梯度的最小工作示例

梯度 cv2.sobelAt the root of all the sophisticated actor-critic algorithms that are designed and applied these days is the vanilla policy gradient algorithm, which essentially is an actor-only algorithm. Nowadays, the actor that learns the decision-making …

共享语义 unix语义_语义UI按钮

共享语义 unix语义什么是语义UI按钮&#xff1f; (What are Semantic UI Buttons?) A button indicates a possible user action. Semantic UI provides an easy-to-use syntax that simplifies not only the styling of a button, but also the natural language semantics.按…

垃圾回收算法优缺点对比

image.pngGC之前 说明&#xff1a;该文中的GC算法讲解不仅仅局限于某种具体开发语言。 mutator mutator 是 Edsger Dijkstra 、 琢磨出来的词&#xff0c;有“改变某物”的意思。说到要改变什么&#xff0c;那就是 GC 对象间的引用关系。不过光这么说可能大家还是不能理解&…

标准C程序设计七---77

Linux应用 编程深入 语言编程标准C程序设计七---经典C11程序设计 以下内容为阅读&#xff1a; 《标准C程序设计》&#xff08;第7版&#xff09; 作者&#xff1a;E. Balagurusamy&#xff08;印&#xff09;&#xff0c; 李周芳译 清华大学出版社…

leetcode 1190. 反转每对括号间的子串

题目 给出一个字符串 s&#xff08;仅含有小写英文字母和括号&#xff09;。 请你按照从括号内到外的顺序&#xff0c;逐层反转每对匹配括号中的字符串&#xff0c;并返回最终的结果。 注意&#xff0c;您的结果中 不应 包含任何括号。 示例 1&#xff1a; 输入&#xff1a…

yolo人脸检测数据集_自定义数据集上的Yolo-V5对象检测

yolo人脸检测数据集计算机视觉 (Computer Vision) Step by step instructions to train Yolo-v5 & do Inference(from ultralytics) to count the blood cells and localize them.循序渐进的说明来训练Yolo-v5和进行推理(来自Ultralytics )以对血细胞进行计数并将其定位。 …

oauth2-server-php-docs 授权类型

授权码 概观 在Authorization Code交付式时使用的客户端想要请求访问受保护资源代表其他用户&#xff08;即第三方&#xff09;。这是最常与OAuth关联的授予类型。 详细了解授权码 用例 代表第三方来电履行 创建一个实例OAuth2\GrantType\AuthorizationCode并将其添加到您的服务…

flask框架视图和路由_角度视图,路由和NgModule的解释

flask框架视图和路由Angular vs AngularJS (Angular vs AngularJS) AngularJS (versions 1.x) is a JavaScript-based open source framework. It is cross platform and is used to develop Single Page Web Application (SPWA). AngularJS(版本1.x)是一个基于JavaScript的开源…

NGUI EventDelagate事件委托

using System.Collections; using System.Collections.Generic; using UnityEngine;public class BUttonClick : MonoBehaviour {public UIButton button_01;void Start(){if (button_01 null){Debug.Log("button组件丢失了");}else{//首先将脚本中的ClicktheButton…

leetcode 461. 汉明距离(位运算)

两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。 给出两个整数 x 和 y&#xff0c;计算它们之间的汉明距离。 注意&#xff1a; 0 ≤ x, y < 231. 示例:输入: x 1, y 4输出: 2解释: 1 (0 0 0 1) 4 (0 1 0 0)↑ ↑上面的箭头指出了对应二进…

图深度学习-第2部分

有关深层学习的FAU讲义 (FAU LECTURE NOTES ON DEEP LEARNING) These are the lecture notes for FAU’s YouTube Lecture “Deep Learning”. This is a full transcript of the lecture video & matching slides. We hope, you enjoy this as much as the videos. Of cou…

Linux下 安装Redis并配置服务

一、简介 1、 Redis为单进程单线程模式&#xff0c;采用队列模式将并发访问变成串行访问。 2、 Redis不仅仅支持简单的k/v类型的数据&#xff0c;同时还提供list&#xff0c;set&#xff0c;zset&#xff0c;hash等数据结构的存储。 3、 Redis支持数据的备份&#xff0c;即mas…

大omega记号_什么是大欧米茄符号?

大omega记号Similar to big O notation, big Omega(Ω) function is used in computer science to describe the performance or complexity of an algorithm.与大O表示法相似&#xff0c;大Omega(Ω)函数在计算机科学中用于描述算法的性能或复杂性。 If a running time is Ω…

leetcode 477. 汉明距离总和(位运算)

theme: healer-readable 题目 两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量。 计算一个数组中&#xff0c;任意两个数之间汉明距离的总和。 示例: 输入: 4, 14, 2 输出: 6 解释: 在二进制表示中&#xff0c;4表示为0100&#xff0c;14表示为1110&…

什么是跨域及跨域请求资源的方法?

1、由于浏览器同源策略&#xff0c;凡是发送请求url的协议、域名、端口三者之间任意一与当前页面地址不同即为跨域。 2、跨域请求资源的方法&#xff1a; (1)、porxy代理(反向服务器代理) 首先将用户发送的请求发送给中间的服务器&#xff0c;然后通过中间服务器再发送给后台服…

量子信息与量子计算_量子计算为23美分。

量子信息与量子计算On Aug 13, 2020, AWS announced the General Availability of Amazon Braket. Braket is their fully managed quantum computing service. It is available on an on-demand basis, much like SageMaker. That means the everyday developer and data scie…