Leetcode 3081. Replace Question Marks in String to Minimize Its Value

本文介绍了解决LeetCode题目3081的方法,通过统计字符频率并利用贪心策略,对字符串中的问号进行替换,以求得总score最小。作者提供了Python代码实现,展示了整个解题过程和时间/内存消耗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 解题思路

这一题其实感觉还是有点难的,主要一开始确实走了弯路,想着用greedy算法逐一推断每一个?的替换字符,但是这很快就遇到了问题,因为要使得总的score最小,那么在替换时不但要考察之前的字母出现次数,还需要考察后续的字母出现次数。

但是也正因此,事实上我们只需要整体上进行分析讨论就行了,要使得最终的string的score最小,我们只需要考察已有的所有字符的出现频次然后进行?符号的替换即可,我们只需要基于总的频数进行替换,就能很快获取我们所需要替换的字符。

然后,我们将其进行进行字符排序后依次填入即可,他们的顺序不会影响最终的score。

2. 代码实现

给出python代码实现如下:

class Solution:
    def minimizeStringValue(self, s: str) -> str:
        cnt = Counter(s)
        rep = []
        q = [(cnt[ch], ch) for ch in string.ascii_lowercase]
        heapq.heapify(q)
        for _ in range(cnt["?"]):
            c, ch = heapq.heappop(q)
            rep.append(ch)
            heapq.heappush(q, (c+1, ch))
        rep = sorted(rep)
        t = ""
        for ch in s:
            if ch == "?":
                t += rep.pop(0)
            else:
                t += ch
        return t

提交代码评测得到:耗时1800ms,占用内存18.8MB。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值