首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >2024-10-08:用go语言,给定一个字符串 word 和一个整数 k,判断是否可以通过删除最少数量的字符使得该字符串成为

2024-10-08:用go语言,给定一个字符串 word 和一个整数 k,判断是否可以通过删除最少数量的字符使得该字符串成为

作者头像
福大大架构师每日一题
发布2024-10-10 19:15:35
发布2024-10-10 19:15:35
5250
举报

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:

chatgpt

题目来自leetcode3085。

大体步骤如下:

1.创建一个长度为26的整型切片 cnt,用来统计单词 word 中每个字母出现的次数。

2.将 cnt 中的值进行排序,使得它们按照出现次数递减的顺序排列。

3.初始化变量 maxSave 为 0,用来记录最大的节省字符数。

4.遍历经过排序后的 cnt 切片,对于每个字母出现的次数 base:

  • • 初始化变量 sum 为 0,用来记录在保留 base+k 个字符的情况下的总字符数量。
  • • 对从当前位置开始的 cnt 切片进行遍历,将出现的字符次数与 base+k 中的较小值累加至 sum
  • • 更新 maxSavesum 与当前 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完整代码如下:

代码语言:javascript
复制
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)
}
returnlen(word)- maxSave
}
func main(){
    word  :="aabcaba"
    k:=0
    fmt.Println(minimumDeletions(word, k))
}

rust完整代码如下:

代码语言:javascript
复制
use std::cmp::{max, min};

fnminimum_deletions(word:&str, k:i32)->i32{
letmut cnt:[i32;26]=[0;26];
forbin word.chars(){
        cnt[(b asu8-b'a')asusize]+=1;
}
slice_sort(&mut cnt);

letmut max_save=0;
for(i,&base)in cnt.iter().enumerate(){
letmut sum=0;
for&c in&cnt[i..]{
            sum +=min(c, base + k);// 最多保留 base+k 个
}
        max_save =max(max_save, sum);
}
(word.len()asi32)- max_save
}

fnslice_sort(slice:&mut[i32;26]){
    slice.sort_unstable();
}

fnmain(){
letword="aabcaba";
letk=0;
println!("{}",minimum_deletions(word, k));
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-10-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 大体步骤如下:
  • go完整代码如下:
  • rust完整代码如下:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档