2024-09-21:用go语言,给定一个字符串 s,字符串中的每个字符要么是小写字母,要么是问号'?'。对于一个仅包含小写字母的字符串t,我们定义cost(i)为在t的前i个字符中与t[i]相同的字符的出现次数。

字符串 t 的分数是所有位置i的cost(i)之和。

现在的任务是用小写字母替换所有的问号'?',使得字符串s的分数最小。如果有多个替换方案使得分数最小,那么返回字典序最小的一个。

输入:s = "???"。

输出: "abc"。

解释:这个例子中,我们将 s 中的问号 '?' 替换得到 "abc" 。

对于字符串 "abc" ,cost(0) = 0 ,cost(1) = 0 和 cost(2) = 0 。

"abc" 的分数为 0 。

其他修改 s 得到分数 0 的字符串为 "cba" ,"abz" 和 "hey" 。

这些字符串中,我们返回字典序最小的。

大体步骤如下:

1.初始化一个大小为27的整型数组freq,用于记录每个字符出现的次数,初始全部为0,26号位作为哨兵。

2.遍历字符串s,若字符不是'?',则在freq相应位置累加。

3.对freq数组进行排序,得到排序后的数组f。

4.统计字符串s中问号'?'的个数q,初始化limit和extra为0。

5.从1开始遍历数组f,计算每个字符值变化产生的增加的字符数sum。

6.若问号数量小于等于sum,则更新limit和extra,并跳出循环。

7.根据limit和extra更新目标替换数组target,将出现次数不超过limit的字符值更新为limit,如果extra大于0,则额外分配给字符值较小的字符。

8.遍历字符串s,遇到问号'?'时用目标数组target替换,替换顺序为字典序最小。

9.返回替换后的字符串作为最终结果。

总体复杂度分析

  • 时间复杂度:遍历字符串s的时间复杂度为O(n),排序时间复杂度为O(nlogn),整体时间复杂度为O(nlogn)。

  • 空间复杂度:除了字符串s本身外,额外使用了大小为27的整型数组freq和target,以及一些辅助变量,总的额外空间复杂度较小,为O(1)。

答案2024-09-21:

chatgpt

题目来自leetcode3081。

go完整代码如下:

package main

import (
"fmt"
"math"
"slices"
"strings"
) func minimizeStringValue(s string) string {
freq := [27]int{26: math.MaxInt / 26} // 哨兵
for _, c := range s {
if c != '?' {
freq[c-'a']++
}
} f := freq
slices.Sort(f[:]) var limit, extra int
q := strings.Count(s, "?")
for i := 1; ; i++ {
sum := i * (f[i] - f[i-1])
if q <= sum {
limit, extra = f[i-1]+q/i, q%i
break
}
q -= sum
} target := freq
for i, c := range freq[:26] {
if c > limit {
continue
}
target[i] = limit
if extra > 0 { // 还可以多分配一个
extra--
target[i]++
}
} ans := []byte(s)
j := byte(0)
for i, c := range ans {
if c != '?' {
continue
}
for freq[j] == target[j] {
j++
}
freq[j]++
ans[i] = 'a' + j
}
return string(ans)
} func main() {
s := "???"
fmt.Println(minimizeStringValue(s))
}

2024-09-21:用go语言,给定一个字符串 s,字符串中的每个字符要么是小写字母,要么是问号‘?‘。对于一个仅包含小写字母的字符串t,我们定义cost(i)为在t的前i个字符中与t[i]相同的字的更多相关文章

  1. ZT 感触的屌丝职场记 投递人 itwriter 发布于 2013-05-27 09:21 评论(18) 有3402人阅读 原文链接 [收藏] « »   作者@幻想哥呀幻想哥   有一位屌丝男,从小抱着报效祖国的理想上了大学,毕业后干了 IT 行业,高中那时候看文汇报说,搞 IT 的在上

    屌丝职场记 投递人 itwriter 发布于 2013-05-27 09:21 评论(18) 有3402人阅读  原文链接  [收藏]  « » 作者@幻想哥呀幻想哥 有一位屌丝男,从小抱着报效祖国的 ...

  2. 2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机)

    2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机) https://www.luogu.com.cn/problem/P2292 题意: 标点符号的出现晚于文字的出 ...

  3. 给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。

    给定两个字符串 s 和 t,它们只包含小写字母.字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母.请找出在 t 中被添加的字母. 示例: 输入: s = "abcd" ...

  4. 查找常用字符(给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。)

    给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表. 例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 ...

  5. 21世纪C语言(影印版)

    <21世纪C语言(影印版)> 基本信息 原书名:21st Century C 作者: Ben Klemens 出版社:东南大学出版社 ISBN:9787564142056 上架时间:201 ...

  6. 终于懂了:Delphi重定义消息结构随心所欲,只需要前4个字节是消息编号就行了(有了这个,就有了主动)

    Delphi重定义消息结构随心所欲,只需要前4个字节是消息编号就行了,跟Windows消息虽然尽量保持一致,但其实相互没有特别大的关系.有了这个,就有了主动,带不带句柄完全看需要. 比如这个结构就带句 ...

  7. 算法战斗:给定一个号码与通配符问号W,问号代表一个随机数字。 给定的整数,得到X,和W它具有相同的长度。 问:多少整数协议W的形式和的比率X大?

    如果说: 给定一个号码与通配符问号W,问号代表一个随机数字. 给定的整数,得到X,和W它具有相同的长度. 问:多少整数协议W的形式和的比率X大? 进格公式 数据的多组,两排各数据的,W,第二行是X.它 ...

  8. 为什么不能在 body 标签的前面的 script 标签中定义 JS 全局变量?

    <!DOCTYPE html> <!-- 为什么不能在 body 标签的前面的 script 标签中定义 JS 全局变量? 在全局环境下的代码就是在页面加载阶段从上到下一边加载一边执 ...

  9. static作用(修饰函数、局部变量、全局变量)转自http://www.cnblogs.com/stoneJin/archive/2011/09/21/2183313.html

    static作用(修饰函数.局部变量.全局变量) 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件 ...

  10. C语言strncasecmp()函数:比较字符串的前n个字符

    定义 int strncasecmp(const char *s1, const char *s2, size_t n); 描述 strncasecmp()用来比较参数s1 和s2 字符串前n个字符, ...

随机推荐

  1. oeasy教您玩转vim - 81 - # 宏macro的进阶

    ​ 宏的进阶 macro 回忆 关于宏,上次有4个要点 qa 开始录制宏 q 结束录制宏 @a 应用宏 qA 追加录制宏 甚至可以编辑宏 "ap 把宏作为文本粘贴出来 编辑之后 " ...

  2. C# LINQ之IEqualityComparer<>接口应用

    在C#语言中,对集合的条件查询.分组统计等操作使用LINQ非常方便,LINQ的语法格式与SQL非常相似和便捷,而LINQ扩展方法配合Lambda更为简洁,如All.Any.Count.Max等Enum ...

  3. 个人使用 sudo 方法

    sudo 作用:允许 系统管理员 授予某些用户或用户组以 其他用户身份 运行某些或所有命令的权限 su 用于变更为其他使用者的身份的命令,一般需要键入该使用者的密码 sudo 则是对 su 使用的简化 ...

  4. 学习笔记--Java方法重载

    Java方法重载 感受 以下代码不使用"方法重载",不使用overload,分析程序存在的缺点 public class OverloadTest01 { // 入口 public ...

  5. 洛谷[NOIP2015 普及组] 金币

    [NOIP2015 普及组] 金币 题目背景 NOIP2015 普及组 T1 题目描述 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第二天和第三天),每天收到两枚金币:之 ...

  6. Spring Boot快速入门(二)搭建javaWeb项目

    1.配置pom.xml 教程一创建的项目为maven项目,所以搭建一个Spring Boot的Web项目,先导入一下jar包:即在pom.xml以下依赖: 1 <dependencies> ...

  7. 找实习,三本计算机 > 985文科 ?

    2018年3月,大三下学期. 写了一段时间博客以后,竟有人说要内推我. 我说我大三,还没毕业,准备暑假去找实习. 网上认识的朋友建议我去春招实习试试,还有些厂在走流程中,还有机会. 我婉拒了,感觉我自 ...

  8. 【CI/CD】Jenkins 部署前后端项目Demo

    前置环境准备: 参考尚硅谷最新发布的Jenkins教程 同样准备了三台服务器: 192.168.124.34 Centos7 8G内存 用于安装GitLab 192.168.124.35 Centos ...

  9. 【SQL】 牛客网SQL训练Part3 较难难度

    获取当前薪水第二多的员工的emp_no以及其对应的薪水salary 请你查找薪水排名第二多的员工编号emp_no.薪水salary.last_name以及first_name,不能使用order by ...

  10. 【Java】JDBC Part4 Transaction 事务

    JDBC Part4 Transaction 事务 什么是事务? 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消. 也就是原子性,一个事务中的一系列的 ...