LC 100249. 替换字符串中的问号使分数最小

https://leetcode.cn/problems/replace-question-marks-in-string-to-minimize-its-value/description/

这题如果想清楚的话还是非常简单的。考虑一个情况就是比如下面这样的字符串

"z .. z .. ? z z ? "

假设两个问号里面只能填写一个z的话,其实填写在哪里是没有任何关系的。对于一个字符,cost完全取决于它在这个字符串里面出现多少次。

如果想清楚这个问题的话,那么算法就是将所有的字符平均使用,完了做一个排序确保字符串序是最小的。

class Solution:
    def minimizeStringValue(self, s: str) -> str:
        from collections import Counter
        cnt = Counter(list(s))

        ans = []
        sel = []
        for c in s:
            if c == '?':
                mv, mc = 1 << 30, None
                for idx in range(26):
                    c2 = chr(ord('a') + idx)
                    if cnt[c2] < mv:
                        mv = cnt[c2]
                        mc = c2
                cnt[mc] += 1
                sel.append(mc)
        sel.sort(reverse=True)
        for c in s:
            if c == '?':
                ans.append(sel.pop())
            else:
                ans.append(c)
        # print(ans)
        return ''.join(ans)