Leetcode 第 126 场双周赛 Problem C 替换字符串中的问号使分数最小(Java + 排序 + 贪心)

文章目录

  • 题目
  • 思路
    • Java + 排序 + 贪心
    • 第一步:
    • 第二步:
    • 第三步:
  • 复杂度
  • Code

题目

  • Problem: 100249. 替换字符串中的问号使分数最小
  • 给你一个字符串 s 。s[i] 要么是小写英文字母,要么是问号 ‘?’ 。
  • 对于长度为 m 且 只 含有小写英文字母的字符串 t ,我们定义函数 cost(i) 为下标 i 之前(也就是范围 [0, i - 1] 中)出现过与 t[i] 相同 字符出现的次数。
  • 字符串 t 的 分数 为所有下标 i 的 cost(i) 之 和 。
  • 比方说,字符串 t = “aab” :
    • cost(0) = 0
    • cost(1) = 1
    • cost(2) = 0
  • 所以,字符串 “aab” 的分数为 0 + 1 + 0 = 1 。
  • 你的任务是用小写英文字母 替换 s 中 所有 问号,使 s 的 分数最小 。
  • 请你返回替换所有问号 ‘?’ 之后且分数最小的字符串。如果有多个字符串的 分数最小 ,那么返回字典序最小的一个。
  • 1 <= s.length <= 10 ^ 5
  • s[i] 要么是小写英文字母,要么是 ‘?’ 。

思路

Java + 排序 + 贪心

第一步:

  • 首先想到的是 dp,但是 dp 需要以每个小写字母个数作为 key,因此时间复杂度是 26 的次方级,
  • 其次思考分数与字母位置无关,因为分数可看做相同字母的对数
  • 因此每个 ? 替换的是当前(字母个数最小的、字典序最小的),
  • 最后还可以升序排序 ? 替换的字符,让字符序最小

第二步:

  • 替换 ? 前、先计算已有字符的个数,
  • 接着找到每个 ? 找到已有字母个数最小的、字典序最小的,
  • 最后更新已有字母(即 ? 替换成的字母)

第三步:

  • 由于分数与字母位置无关,
  • 因此最后升序排序 ? 替换的字符,可以让字符序最小
  • 例如:27 个 ?,就是 a-z 各 1 个,再 a 1 个,但是结果为:aabcd…z

复杂度

时间复杂度:

时间复杂度: O ( 26 ∗ n ) O(26*n) O(26n)

空间复杂度:

空间复杂度: O ( 26 + n ) O(26+n) O(26+n)

Code

class Solution {/*** Java + 排序 + 贪心** 第一步:* 首先想到的是 dp,但是 dp 需要以每个小写字母个数作为 key,因此时间复杂度是 26 的次方级,* 其次思考分数与字母位置无关,因为分数可看做**相同字母的对数**,* 因此每个 ? 替换的是当前(字母个数最小的、字典序最小的),* 最后还可以升序排序 ? 替换的字符,让字符序最小** 第二步:* 替换 ? 前、先计算已有字符的个数,* 接着找到每个 ? 找到已有字母个数最小的、字典序最小的,* 最后更新已有字母(即 ? 替换成的字母)** 第三步:* 由于分数与字母位置无关,* 因此最后升序排序 ? 替换的字符,可以让字符序最小* 例如:27 个 ?,就是 a-z 各 1 个,再 a 1 个,但是结果为:aabcd...z** 时间复杂度:O(26*n),空间复杂度:O(26+n)**/public String minimizeStringValue(String s) {// 已有字符的个数int[] count = new int[26];for (int i = 0; i < s.length(); i++) {int c = s.charAt(i);if (c != '?') {count[c - 'a']++;}}// ? 需要替换的小写字母个数int[] addCharCount = new int[26];for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);if (c == '?') {// 已有字母个数最小的、字典序最小的int minVal = Integer.MAX_VALUE;int minCharIndex = 0;for (int j = 0; j < 26; j++) {if (minVal > count[j]) {minVal = count[j];minCharIndex = j;}}addCharCount[minCharIndex]++;// ? 已确定为 minCharIndex+'a'count[minCharIndex]++;}}// 按照字典序从小到大更新 ? 成需要替换的字母StringBuilder res = new StringBuilder();for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);if (c == '?') {// 可用双指针(不过时间复杂度不以此处)for (int j = 0; j < 26; j++) {if (addCharCount[j] > 0) {c = (char)(j + 'a');addCharCount[j]--;break;}}}res.append(c);}return res.toString();}
}

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

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

相关文章

任职资格中的一些面试题和知识点

目录 一、计算机数据结构基本概念理解&#xff1a;1. 数组基本概念优缺点以及如何改进常用的操作底层实现还有哪些容易问到的问题&#xff1a;关于数组的一些衍生数据结构和算法问题 2. 链表基本概念&#xff1a;链表的节点是什么&#xff1f;每个节点包含哪些信息&#xff1f;…

【计算机网络】https的工作原理以及和http的区别

目录 前言 1. HTTP协议存在的问题 2. 什么是HTTPS协议&#xff1f; 3. HTTP和HTTPS有哪些区别&#xff1f; 4. HTTPS的工作原理 加密方式 前言 在日常的Web项目练习中&#xff0c;我们会发现老师会让我们在打开服务器之后使用 http://localhost/...进行项目效果测试和预览…

2.26OS分类,中断(内,外),系统调用,操作系统结构、引导,虚拟机(两类VMM),进程

外核可以申请分配连续的磁盘块以支持频繁的随机访问&#xff0c;其它的方式是采用虚拟存储 分层结构

MongoDB yum安装教程

1 配置yum源 cat /etc/yum.repos.d/mongodb-org-6.0.repo ##################################################### [mongodb-org-6.0] nameMongoDB Repository baseurlhttps://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/6.0/x86_64/ gpgcheck1 enabled1 gpgkeyht…

iPhone 的健康数据采用的是 FHIR 传输格式

虽然感觉 FHIR 的数据传输格式还是有点繁琐的&#xff0c;但貌似现在也是唯一的事实上的标准。 通过 iPhone 健康上面查看的数据来看&#xff0c;有关健康的数据还是使用 FHIR 的数据传输格式。 不管怎么样&#xff0c;针对老旧的数据传输格式来看&#xff0c;FHIR 至少目前还是…

实现HBase表和RDB表的转化(附Java源码资源)

实现HBase表和RDB表的转化 一、引入 转化为HBase表的三大来源&#xff1a;RDB Table、Client API、Files 如何构造通用性的代码模板实现向HBase表的转换&#xff0c;是一个值得考虑的问题。这篇文章着重讲解RDB表向HBase表的转换。 首先&#xff0c;我们需要分别构造rdb和hba…

学习开发小程序的起航日记

2024年3月16日 不知不觉中三月份还只剩了一半的光景&#xff0c;我想写的内容还很多没有写&#xff0c;或者更应该说&#xff0c;是想积累的还有很多。现在最应该去完善Java的内容&#xff0c;可还是想先等等。想等搞清楚小程序部分&#xff0c;想等积累完小程序的内容。 这几…

PBOOTCMS在nginx虚拟主机location配置中添加规则

PBOOTCMS在nginx虚拟主机location配置中添加规则&#xff0c;规则如下&#xff1a; 1、X版本使用如下规则&#xff1a; location / { if (!-e $request_filename){ rewrite ^/(.*)$ /index.php/$1 last; } } 2、X版本使用如下规则&#xff1a; location / { if (!-e $reques…

Golang 泛型定义类型的时候前面 ~ 代表什么意思

先看代码&#xff0c;定义一个简单的泛型 c1 里面一个 int &#xff0c;定义一个函数goods 下面 main函数进行调用, 如果直接传int 类型是不会报错的,但是如果传自定义类型的b就会报错。 type c1 interface {int }func goods[T c1](a T) {fmt.Println(a) }type myint intfunc …

网络安全——关于防火墙

网络安全防火墙是很重要的部分&#xff0c;关于防火墙我们要知道&#xff0c;他默认所有流量都是黑名单&#xff0c;只有开启允许通过才可以。 我们通过一个实验来学防火墙命令。 防火墙要登录才能使用&#xff0c;用户名是admin,默认密码是Admin123&#xff0c;在第一次登录…

Visual Studio配置libtorch(cuda安装一步到位)

Visual Studio配置libtorch visual Studio安装cuDNN安装CUDAToolkit安装libtorch下载Visual Studio配置libtorch(cuda版本配置) visual Studio安装 visual Studio点击安装 具体的安装和配置过程这里就不进行细讲了&#xff0c;可以参考我这篇博客Visual Studio配置OpenCV(保姆…

Java关于物联网消息引擎:EMQ X

1.背景 1、5G 时代&#xff0c;万物互联 随着5G的到来&#xff0c;万物互联已经成为现实&#xff0c;物联网行业得以蓬勃发展&#xff0c;催生了很多的应用&#xff0c;比如&#xff1a;物联网pass平台&#xff0c;车联网&#xff0c;面向云平台的IOT-Hub&#xff0c;NB-IoT蜂…

Simulink|局部遮荫下光伏组件多峰值PSO-MPPT控制

目录 主要内容 1.光伏电池工程数学模型的输出特性程序 2.普通扰动观察法进行MPPT 3.基于粒子群寻优的多峰输出特性 4.PSO_MPPT仿真模型 程序下载链接 主要内容 在实际的光伏发电系统中,由于环境多变等因素的影响,当局部出现被遮挡情况时光伏阵列的功率-电压(P-U)特…

Java集合类:List、Set、Map常用集合解析

Java集合类&#xff1a;List、Set、Map常用方法解析 文章目录 Java集合类&#xff1a;List、Set、Map常用方法解析一、List集合&#xff1a;有序的元素集合1. ArrayList2. LinkedList 二、Set集合&#xff1a;无序的不重复元素集合1. HashSet2. TreeSet 三、Map集合&#xff1a…

思科CISCO ASA 5555防火墙如何新增一条Ipsec隧道至深信服防火墙

环境: 总部:深信服 AF 8.0.75 分部:思科AF ASA 5555 Cisco Adaptive Security Appliance Software Version 9.4(2)6 Device Manager Version 7.5(2)153 问题描述: 思科CISCO ASA 5555防火墙如何新增至深信服设备 Ipsec隧道 解决方案: Ipsec知识 IKE模式(第1阶段)…

【C语言】字符与字符串---从入门到入土级详解

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C语言 ⚙️操作环境:Visual Studio 2022 目录 一.字符类型和字符数组&#xff08;串&#xff09;简介 1.ASCII 2.定义&#xff0c;初始化&#xff0c;使用 1>字符的定义及初始化 2>字符串的定义及初始化 二.…

Linux 网络虚拟化 Macvlan(基于物理网络接口虚拟网络接口) 认知

写在前面 博文内容涉及 Macvlan 的简单认知&#xff0c;以及一个Demo博文内容根据《 Kubernetes 网络权威指南&#xff1a;基础、原理与实践》 整理理解不足小伙伴帮忙指正 不必太纠结于当下&#xff0c;也不必太忧虑未来&#xff0c;当你经历过一些事情的时候&#xff0c;眼前…

flink1.18.0 自定义函数 接收row类型的参数

比如sql中某字段类型 array<row<f1 string,f2 string,f3 string,f4 bigint>> 现在需要编写 tableFunction 需要接受的参数如上 解决方案 用户定义函数|阿帕奇弗林克 --- User-defined Functions | Apache Flink

传输层/UDP/TCP协议

再谈端口号 TCP/IP协议用“源IP”&#xff0c;“源端口号”&#xff0c;“目的IP”&#xff0c;“目的端口号”&#xff0c;“协议号”&#xff0c;这样一个五元组来标识一个通信&#xff08;可以用netstat -n来查看&#xff09;。 端口号的划分和知名端口号 我们之前就说过&am…

Linux信号量(简易版)

Sem.hpp(用于封装信号量): #include<iostream> #include<queue> #include<unistd.h> #include <semaphore.h> using namespace std; class Sem { public:Sem(int num){sem_init(&_sem,0,num);}~Sem(){sem_destroy(&_sem);}void V(){sem_post(…