Учитывая массив слов и строку, как я могу посчитать все слова в данной строке - PullRequest
0 голосов
/ 08 января 2020

Учитывая массив слов и строку, мне нужно сосчитать все слова, присутствующие в данной строке.

Я разделил предложение и включил слова в карту ha sh. Однако, когда я перебираю строковый массив, чтобы проверить, присутствует ли это слово, я получаю неправильный вывод. Как мне исправить код?

#include<bits/stdc++.h> 
using namespace std; 
void countwords(string str,string words[],int n )
{
    map<string ,bool > m1;  //map 
    map<string ,bool > ::iterator it; 
    int i=0,cnt=0; 
    string temp = " "; 
    while(i<str.size()) // splitting of sentence into words
    {
        while(str[i]!=' '&&i<str.size()&&str[i]!='.') // if it doesnt encounter space, add it to temp
        {
            temp+=str[i]; 
            i++; 
        }
        m1[temp]=true;  // insert temp into map
        temp=" "; 
        i++; 
    }

    for(i=0;i<n;i++)
    { 
        if(m1.find(words[i])!=m1.end()&&m1[words[i]]==true) // if word is present in the map increment count & it isn't a duplicate
        {    
            cnt++; 
            m1[words[i]]=false;
         } 
     } 
     cout<<cnt; 
}

1 Ответ

1 голос
/ 08 января 2020

Есть некоторые проблемы с вашим кодом.

1- temp = "", вам нужно задать временную пустую строку, иначе функция find () не будет работать для нее

2 - используя map, у вас будет только один экземпляр слова в карте, поэтому вам нужно вести подсчет каждого слова.

Ниже код подсчитывает и печатает количество слов данного массива с минимальными изменениями в вашем коде:

void countwords(string str,string words[],int n ){
map<string ,int > m1;
int i=0, cnt=0;
string temp = "";
while(i < str.size())
{
    while(str[i]!=' ' && i<str.size() && str[i]!='.')
    {
        if(str[i]!=' ' && str[i]!='.')
            temp+=str[i];
        i++;
    }
    auto iii = m1.find(temp);
    int count = 0;
    if(iii != m1.end())
        count = iii->second;
    count+=1;
    m1[temp]=count;

    temp="";
    i++;
}

for(int i=0; i != n; i++)
{
    auto found = m1.find(words[i]);
    if(found != m1.end())
        std::cout << found->first << " " << found->second << std::endl;
    else cout << words[i] << " " << "0" << std::endl;
}}
...