我有字符串说“walk talk,can't won't Won't woN'T talk.”我想计算重复的单词并显示。 注意:不区分大小写。
我用过定界符
strtok(string, ",.;:\"!? -_\n\t*()@#=+");
并保存在
char *temp[100];
现在如何检查单词的重复?并显示如下
3 won't
2 talk
1 can't
1 walk
它应该从最高重复率到最低重复率显示。如果重复相同则显示字母顺序。
抱歉我的英语不好。
最佳答案
使用 std::string 来保存 strtok()
的结果.然后创建一个 std::map<string, int>
保存字符串(键)出现的次数。
您可以使用以下内容填充 map :
std::map<string, int> myMap;
myMap[tokenizedWord]++; //Increase count of word.
然后您可以循环遍历 map 内容并打印出整数值大于 2 的任何地方。
for (std::map<string, int>::iterator iter = myMap.begin(); iter != myMap.end(); ++iter)
{
if (iter->second > 1)
std::cout << "Duplicated word: " << iter->first << " count = " << iter->second;
}
我会让你弄清楚如何按顺序遍历它。您可以将值放在 vector 或其他东西中并使用 std::sort
在打印或其他任何你喜欢的东西之前。遗憾的是, map 是关联容器,您无法对它们进行排序,因为这会破坏它们的内部顺序。
std::map 的背景信息
映射是一个关联数组,这意味着每个键都映射到一个特定的值,并且键是唯一的。实际上,您可以创建键不唯一的多重映射,因此这很重要。
基本上,由于键是唯一的,您只需将键用作数组索引即可访问或创建元素。
例如:
//Create a map and insert a couple things into it - prices of meat?
std::map<string, float> myMap;
myMap["Chicken"] = 4.99;
myMap["Turkey"] = 6.99;
//Retrieve the price of something using the key.
std::cout << "Chicken costs " << myMap["Chicken"] << std::end;
您也可以在 map 上执行标准的插入和定位操作,但关联数组语法更简单,何必呢? :)
PS: 为了完整回答您的评论,以防万一,myMap[tokenizedWord]++ 末尾的++ 只是说增加为该键存储的整数值的值1. 你也可以做 myMap[tokenizedWord] = myMap[tokenizedWord] + 1 或者你也可以做 myMap[tokenizedWord] += 1.
关于C++,计算字符串中重复的单词并显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11833882/