【发布时间】:2020-01-05 19:33:31
【问题描述】:
我想从字符串中删除 K 个字符,以使每个字符的出现最少。
例如:
字符串:abcdefghijkllllll
K:5
答案:12 (abcdeghijkl)
字符串:ababac
K:4
答案:3 (aac)
字符串:aaaab
K:4
答案:1(b)
我想删除 5 个字符。这些字符将是 5 个l's
到目前为止,我所做的是使用地图计算每个字符的出现次数
但我不知道下一步该做什么。
#include <bits/stdc++.h>
using namespace std;
string s;
int l, k;
map<char, int> m;
int main() {
getline(cin, s);
scanf("%d %d", &l, &k);
for(int i=0; i<s.length(); i++) {
m[s[i]]++;
}
for(auto &x : m) {
cout << x.second << "\n";
}
return 0;
}
预期结果是删除任何给定字符串的字符后字符串的最小长度(可以排序或未排序)。
您可以删除字符串中的任何字符
更新:
#include <bits/stdc++.h>
using namespace std;
string s;
int l, k;
map<char, int> m;
int main() {
getline(cin, s);
cin >> l >> k;
for(int i = 0; i < s.length(); i++) {
m[s[i]]++;
}
for(auto it = m.end(); it != m.begin(); it--) {
// cout << it->second << "\n";
}
vector<pair<int, int>> pairs;
for (auto itr = m.begin(); itr != m.end(); itr++) {
pairs.push_back(*itr);
}
sort(pairs.begin(), pairs.end(), [=](pair<int, int>& a, pair<int, int>& b) { return a.second < b.second; } );
for(auto it = m.end(); it != m.begin(); it--) {
if(it->second - k >= 1) {
it->second-=k;
k -= it->second;
}
}
int sum = 0;
for(auto it = m.end(); it != m.begin(); it--) {
sum += it->second;
// cout << it->second << "\n";
}
cout << sum << "\n";
return 0;
}
目前的问题是它没有读取所有字符并将它们正确映射到地图。
【问题讨论】:
-
您能否详细说明一下任务和预期结果是什么?字段总是排序的?仅当它们彼此相邻且相同时才能删除它们...?
-
@libik 已更新。
-
还不清楚,所以从
abac我可以做abc吗? -
是的,给定 K >= 1,inteded 结果将是 abc
-
你能提供这个问题的原始出处吗?