我们如何计算或比较字符串?

时间:2017-01-16 15:28:27

标签: c++11

我希望它一次读取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

1 个答案:

答案 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)方式重写那个循环,但我会把它作为读者的练习。