当前位置: 首页 > 知识库问答 >
问题:

如果一个单词在一个字符串中重复了很多次,我该如何计算这个单词的重复次数和它们的位置呢?

仇航
2023-03-14

如果一个单词在一个字符串中重复了很多次,我该如何计算这个单词的重复次数和它们的位置呢?

#include <cstring>
#include <iostream>
#include <string>

using namespace std;

int main()
{
    string str;
    getline(cin, str);
    string str2;
    getline(cin, str2);
    const char* p = strstr(str.c_str(), str2.c_str());
    if (p)
        cout << "'" << str2 << "' find in " << p - str.c_str();
    else
        cout << target << "not find \"" << str << "\"";

    return 0;
}

共有1个答案

阮炯
2023-03-14

下面的代码使用了很多标准库来为我们做一些常见的事情。我使用一个文件将单词收集到一个大字符串中。然后,我使用std::StringStream分隔空格上的单词,并将单个单词存储在std::Vector(一个数组,可管理其大小,并在需要时增长)中。为了获得良好的单词计数,还必须删除标点符号和大写,这是在sanitize_word()函数中完成的。最后,我将单词添加到一个映射中,其中单词是关键字,int是该单词出现的次数。最后,我打印地图以获得完整的字数。

我直接进行任何字符串解析的唯一地方是在sanitize函数中,它是使用恰当命名的erase/remove习惯用法完成的。在可能的情况下让标准库为我们做这些工作要简单得多。

input.txt的内容:

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. And when it has gone past, I will turn the inner eye to see its path. Where the fear has gone, there will be nothing. Only I will remain.
#include <algorithm>
#include <cctype>
#include <fstream>
#include <iostream>
#include <map>
#include <sstream>
#include <string>
#include <vector>

// Removes puncuation marks and converts words to all lowercase
std::string sanitize_word(std::string word) {
  word.erase(std::remove_if(word.begin(), word.end(),
                            [punc = std::string(".,?!")](auto c) {
                              return punc.find(c) != std::string::npos;
                            }),
             word.end());
  for (auto& c : word) {
    c = std::tolower(c);
  }

  return word;
}

int main() {
  // Set up
  std::ifstream fin("input.txt");
  if (!fin) {
    std::cerr << "Error opening file...\n";
    return 1;
  }

  std::string phrases;
  for (std::string tmp; std::getline(fin, tmp);) {
    phrases += tmp;
  }
  fin.close();

  // Words are collected, now the part we care about
  std::stringstream strin(phrases);
  std::vector<std::string> words;
  for (std::string tmp; strin >> tmp;) {
    words.push_back(tmp);
  }

  for (auto& i : words) {
    i = sanitize_word(i);
  }

  // std::map's operator[]() function will create a new element in the map if it
  // doesn't already exist
  std::map<std::string, int> wordCounts;
  for (auto i : words) {
    ++wordCounts[i];
  }

  for (auto i : wordCounts) {
    std::cout << i.first << ": " << i.second << '\n';
  }
}

输出:

and: 2
be: 1
brings: 1
eye: 1
face: 1
fear: 5
gone: 2
has: 2
i: 5
inner: 1
is: 2
it: 2
its: 1
little-death: 1
me: 2
mind-killer: 1
must: 1
my: 1
not: 1
nothing: 1
obliteration: 1
only: 1
over: 1
pass: 1
past: 1
path: 1
permit: 1
remain: 1
see: 1
that: 1
the: 4
there: 1
through: 1
to: 2
total: 1
turn: 1
when: 1
where: 1
will: 5
 类似资料:
  • 问题内容: 我是Java字符串的新手,问题是我想计算字符串中特定单词的出现次数。假设我的字符串是: 现在,我也不想拆分它,所以我想搜索一个“雄猫”这个词。它在我的字符串中出现了两次! 我正在尝试的是: 它给了我46个计数器的价值!那么解决方案是什么? 问题答案: 您可以使用以下代码: 演示版 它匹配。 表示在找到匹配项时执行循环内给出的任何操作。并且我将by 的值递增,因此很显然,这给出了一个字符

  • 我有一个程序,其中有一个名称列表,输出说明名称出现了多少次,以及单词出现在哪一行。现在,如果一个名字出现两次,它只输出第一个出现的单词的行号。如果名字出现了不止一次,我怎么能让它说出名字在哪一行呢?

  • 我想替换字符串中的一些单词。我有可行的解决方案,但我认为这不是最好的。你能帮我做些更有效的事情吗 代码是avaiable在这里:https://codepen.io/yasAFE/pen/BYOVme

  • 我是新的java和卡在如何返回已输入的整个地址,因为我目前只返回第一个字。下面是代码: 如果有任何帮助,我将不胜感激。

  • 问题内容: 如果我有英文文章或英文小说,并且想计算每个单词出现多少次,用Java编写的最快算法是什么? 有人说您可以使用Map ()完成此操作,但我想知道如何知道关键字是什么?每篇文章都有不同的词,您如何知道“关键”词,然后在其数量上加上一个? 问题答案: 这个数字“我是”只是一个字

  • 我必须定义一个包含大写方法的Translator类。该方法将收到一个StringBuffer,它只包含英文字母和空格,并将更改它,以便每个单词都以大写字母开头。 //我需要定义的类