力扣3081.替换字符串中的问号使分数最小
-
用一个最小堆存出现最少次数的字母
- 每次找到一个后存入string里
- 从小到大排序(字典序最小)
- 遍历每一个?,用t中字母逐一替换
-
class Solution { public: string minimizeStringValue(string s) { int freq[26]{}; for(char c:s) if(c != '?') freq[c - 'a'] ++; priority_queue<pair<int,char>,vector<pair<int,char>>,greater<>> q; for(int i=0;i<26;i++) q.emplace(freq[i],'a' + i); int p = ranges::count(s,'?'); string t(p,0); for(int i=0;i<p;i++) { auto [f,c] = q.top(); q.pop(); t[i] = c; q.emplace(f+1,c); } ranges::sort(t); for(int i=0,j=0;i<s.size();i++) if(s[i] == '?') s[i] = t[j++]; return s; } };