我希望它一次读取1个字符串,并计算字符串出现在逗号之后的时间,如果A出现有计数+ = 1,如果B出现,那么单独计数+ = 1然后执行相同的操作到另一个字符串,如果它出现比第一个字符串多两个而不是保存它
前:
string num1 = "A, B , C, AB, AC"
string num2 = "A, B, C , AB, A, C, AC, AB"
istringstream uc(num2);
string num3
while(getline(uc,num3,',')) //get part of the string after you see ','
{
}
结果:因为它们出现了两次
C, AB , A
答案 0 :(得分:1)
首先,我创建一个函数来计算字符串中每个单词的出现次数。我可能会将这些信息存储在std::map
中,因为这非常方便。
然后,我只是遍历num2
的计数,如果它大于num1
的计数,我会打印字符串。
它可能看起来像这样:
#include <iostream>
#include <map>
#include <regex>
#include <string>
std::map<std::string, int> StringCounts(std::string input) {
static const std::regex re(" *, *");
std::map<std::string, int> counts;
for (std::sregex_token_iterator it(input.begin(), input.end(), re, -1);
it != std::sregex_token_iterator();
++it)
counts[*it]++;
return counts;
}
int main() {
const std::string num1 = "A, B , C, AB, AC";
const std::string num2 = "A, B, C , AB, A, C, AC, AB";
auto counts1 = StringCounts(num1);
auto counts2 = StringCounts(num2);
for (auto pair : counts2) {
const std::string &word = pair.first;
if (counts2[word] > counts1[word])
std::cout << word << ", ";
}
std::cout << "\n";
}
哪个输出:
A, AB, C,
如果我们关心性能,我们可能会注意到我们正在迭代地图很多次。我们可以用O(n)方式重写那个循环,但我会把它作为读者的练习。