2024-10-08:用go语言,给定一个字符串 word 和一个整数 k,判断是否可以通过删除最少数量的字符使得该字符串成为 k 特殊字符串。 其中,k 特殊字符串满足字符串中任意两个字符的出现频率
2024-10-08:用go语言,给定一个字符串 word 和一个整数 k,判断是否可以通过删除最少数量的字符使得该字符串成为 k 特殊字符串。
其中,k 特殊字符串满足字符串中任意两个字符的出现频率之差的绝对值均不超过 k。
你可以编写一个算法来计算最少需要删除多少个字符,使得给定的字符串 word 成为 k 特殊字符串。
输入:word = "aabcaba", k = 0。
输出:3。
解释:可以删除 2 个 "a" 和 1 个 "c" 使 word 成为 0 特殊字符串。word 变为 "baba",此时 freq('a') == freq('b') == 2。
答案2024-10-08:
题目来自leetcode3085。
大体步骤如下:
1.创建一个长度为26的整型切片 cnt
,用来统计单词 word
中每个字母出现的次数。
2.将 cnt
中的值进行排序,使得它们按照出现次数递减的顺序排列。
3.初始化变量 maxSave
为 0,用来记录最大的节省字符数。
4.遍历经过排序后的 cnt
切片,对于每个字母出现的次数 base:
初始化变量
sum
为 0,用来记录在保留 base+k 个字符的情况下的总字符数量。对从当前位置开始的 cnt 切片进行遍历,将出现的字符次数与 base+k 中的较小值累加至
sum
。更新
maxSave
为sum
与当前maxSave
中的较大值。
5.计算最终需要删除的字符数量,即 len(word) 减去 maxSave
的值。
总的时间复杂度:在代码中,排序操作应该是最耗时的部分,时间复杂度为 O(nlog(n)),n 为单词长度。接下来的遍历操作的时间复杂度为 O(26 * n),因为对于每个字符,我们需要对 cnt 切片进行遍历。最终总的时间复杂度为 O(nlog(n) + 26n),约等于 O(nlog(n))。
总的额外空间复杂度:除了输入参数外,代码中使用了长度为26的整型切片 cnt,因此额外空间复杂度为 O(26)(常量级别)。
go完整代码如下:
package main
import (
"fmt"
"slices"
)
func minimumDeletions(word string, k int) int {
cnt := make([]int, 26)
for _, b := range word {
cnt[b-'a']++
}
slices.Sort(cnt)
maxSave := 0
for i, base := range cnt {
sum := 0
for _, c := range cnt[i:] {
sum += min(c, base+k) // 至多保留 base+k 个
}
maxSave = max(maxSave, sum)
}
return len(word) - maxSave
}
func main() {
word := "aabcaba"
k:=0
fmt.Println(minimumDeletions(word, k))
}
rust完整代码如下:
use std::cmp::{max, min};
fn minimum_deletions(word: &str, k: i32) -> i32 {
let mut cnt: [i32; 26] = [0; 26];
for b in word.chars() {
cnt[(b as u8 - b'a') as usize] += 1;
}
slice_sort(&mut cnt);
let mut max_save = 0;
for (i, &base) in cnt.iter().enumerate() {
let mut sum = 0;
for &c in &cnt[i..] {
sum += min(c, base + k); // 最多保留 base+k 个
}
max_save = max(max_save, sum);
}
(word.len() as i32) - max_save
}
fn slice_sort(slice: &mut [i32; 26]) {
slice.sort_unstable();
}
fn main() {
let word = "aabcaba";
let k = 0;
println!("{}", minimum_deletions(word, k));
}
2024-10-08:用go语言,给定一个字符串 word 和一个整数 k,判断是否可以通过删除最少数量的字符使得该字符串成为 k 特殊字符串。 其中,k 特殊字符串满足字符串中任意两个字符的出现频率的更多相关文章
- 给定一个字符串str,将str中连续两个字符为a的字符替换为b(一个或连续超过多个字符a则不替换)
需求:给定一个字符串str,将str中连续两个字符为a的字符替换为b(一个或连续超过多个字符a则不替换) 如: a 不替换 b 不替换 ab 不替换 ba 不替换 aba 不替换 aab 替换为 ...
- [百度]数组A中任意两个相邻元素大小相差1,在其中查找某个数
一.问题来源及描述 今天看了July的微博,发现了七月问题,有这个题,挺有意思的. 数组A中任意两个相邻元素大小相差1,现给定这样的数组A和目标整数t,找出t在数组A中的位置.如数组:[1,2,3,4 ...
- (笔试题)数组A中任意两个相邻元素大小相差1,在其中查找某个数。
题目: 数组A中任意两个相邻元素大小相差1,现给定这样的数组A和目标整数t,找出t在数组A中的位置.如数组:[1,2,3,4,3,4,5,6,5],找到4在数组中的位置. 思路: 很明显,在数组中寻找 ...
- validate插件:验证密码没有空格 用户名是5-10位 至少包含数字和大小写字母中的两种字符
//校验密码是否含有空格 jQuery.validator.addMethod("notblank", function(value, element) { var pwdblan ...
- Poj The xor-longest Path 经典题 Trie求n个数中任意两个异或最大值
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5646 Accepted: 1226 Description In an ...
- python 对列表中任意两个数进行操作 (python operate any two elements in list)
python中, 实现列表中的整型元素两两相乘或列表中的数组元素两两相与 1. 假设列表中的元素是整型, 可调用以下函数: def list_any_two_mul(mylist): num ...
- js正则--验证6-12位至少包含数字、小写字母和大些字母中至少两种字符,
var reg=/^((([a-z])+([0-9])+)|(([0-9])+([a-z])+)|(([A-Z])+([0-9])+)|(([0-9])+([A-Z])+)|(([a-z])+([A- ...
- c语言统计一个文件中的单词,字符和行数
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- 求最长的任意两元素差不超过M的子段——双指针+单调队列hdu4123
换根dp的部分比较容易,难点在于求求最长的任意两元素差不超过M的子段 首先会想到双指针维护(尺取法),如果p1,p2间的max-min>M,那么p1向右移动,直到p1,p2间的max-min&g ...
- [LeetCode] 1-bit and 2-bit Characters 一位和两位字符
We have two special characters. The first character can be represented by one bit 0. The second char ...
随机推荐
- PHP现代化构建工具: 无需修改任何代码和扩展将你的ThinkPHP项目性能提高20倍
我要分享一个令人激动的黑科技:PRipple 使用这个项目能够在无需修改任何代码且无需第三方扩展的前提下,将你的 Laravel 项目性能提高 20 倍.他仅仅依赖于PHP原生的 pcntl/posi ...
- python对象之间的交互
python对象之间的交互 先看看一般的类定义如下: class 类名: def __init__(self,参数1,参数2): self.对象的属性1 = 参数1 self.对象的属性2 = 参数2 ...
- Fidder响应数据SyntaxView乱码的处理方法
当Fidder查看响应数据"SyntaxView"出现乱码时,可以点击上方菜单栏的"Decode"按钮,等"Decode"出现蓝色边框后再重 ...
- 【DataBase】MySQL 10 SQL函数 单行函数其四 其他函数
其他函数 -- 其他函数 -- MySQL版本查看 SELECT VERSION(); -- DATABASE 当前所属的数据库查看 SELECT DATABASE(); -- USER 当前用户 S ...
- JDBC详解学习笔记
JDBC简介 架构时--没有什么是加一层解决不了的,如果有,就再加一层. 如tomcat集群上面的Nginx,Nginx集群上面的LVS. JDBC是数据库驱动的接口规范,是SUN公司未来简化开发人员 ...
- Ubuntu18.04 系统环境下 vscode中忽略pylint某些错误或警告
相关: ubuntu18.04系统环境下使用vs code安装pylint检查python的代码错误 ====================================== 假设已经在前文(ht ...
- 传奇人物:“Linux之父”林纳斯·托瓦兹(Linus Torvalds)
偶然看到一个视频: https://www.youtube.com/watch?v=H32IXRkPjHA 林纳斯·托瓦兹(Linus Torvalds)是当之无愧的技术领袖.尤其是那句Just fo ...
- plsql中的常用功能整理
1.关键字查找 2.保存登录密码 完美!
- css 优惠券波浪线效果
<ul> <li> <i class="left"></i><span class="center"> ...
- 9.150 Predefined macros
9.150 Predefined macros The ARM compiler predefines a number of macros. These macros provide informa ...