C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++で指定されたすべての文に存在する単語の数


文字列の形で複数の文が与えられます。目標は、すべての文に存在する単語の数を数えることです。

−すべて小文字を含む単語のみが考慮されます

文が-

の場合

「私はC言語を学んでいます」

「新しいことを学ぶのは簡単です」

「子供たちは健康的な習慣を学んでいます」

3つすべてに「学習」だけが存在します。したがって、カウントは1です。

例を挙げて理解しましょう

入力 −「服は乾いていた」、「子供たちはみんな遊んでいた」、「それらは最高の日だった」

出力 −指定されたすべての文に存在する単語の数は− 2

説明 −「the」と「were」という単語はすべての文に含まれています。

入力 −「私たちは学校に行きます」、「あなたが喜んでそれから続けるなら」、「これらはすべて売られています」

出力 −指定されたすべての文に存在する単語の数は− 1

説明 −「are」という単語はすべての文に含まれています。

以下のプログラムで使用されているアプローチは次のとおりです

このアプローチでは、最初に最初の文の単語をvector >setに格納します。

unordered_map チェックを使用して、他のすべての文のベクトルセット内の単語を検索します。

  • vectorvecを取ります。そして、文を含むすべての文字列で初期化します。

  • 文の数はvec.size()になります。

  • 関数words_sentences(vector vec、int size)は、文とサイズのベクトルを取り、指定されたすべての文に存在する単語の数を返します

  • 初期カウントを0とします。

  • 一時的な文字列strを使用して、個々の単語を文に格納します。

  • whileループを使用してvec[0]に格納されている最初の文をトラバースします。

  • 別のwhileループを使用してその内部で、スペースが見つかるまでstr[]内の個々の単語を抽出します。

  • strの最初の文の単語ができたので、セットに(str、true)のペアを追加します。

  • vec[0]に保存されている文のすべての単語に対してこれを行います。

  • ベクトルセットには、真の値を持つ最初の文のすべての単語のペアが含まれるようになりました。

  • j =1からjまでのforループを使用して、2番目の文から最後の文までの文のベクトルをトラバースします。

  • vec [j]の現在の文から各単語を抽出し、strに保存します。

  • check [str]=trueを使用したマップチェックでこれらの単語をtrueとしてマークします。

  • vec[j]の現在の文のすべての単語に対してこれを行います。

  • forループ、トラバースベクトルセット、および現在の文を使用して、チェック対象のこれらの単語もセットに含まれているかどうかを確認します。

  • forループを使用して、ベクトルセットを再度トラバースします。

  • 現在の単語がすべての文に含まれている場合、set[k].secondが真になります。はいの場合、カウントをインクリメントします。

  • 最後に、すべての文に単語が含まれる可変カウントがあります。

  • 結果としてカウントを返します。

#include <bits/stdc++.h>
using namespace std;
int words_sentences(vector<string> vec, int size){
   int count = 0;
   int i = 0;
   string str;
   unordered_map<string, bool> check;
   vector<pair<string, bool>> set ;
   pair<string, bool> str_bool;
   while (i < vec[0].size()){
      str = "";
      while (i < vec[0].size() && vec[0][i] != ' '){
         str += vec[0][i];
         i++;
      }
      i++;
      if (str != ""){
         str_bool = make_pair(str, true);
         set.push_back(str_bool);
      }
   }
   for (int j = 1; j < size; j++){
      check.clear();
      i = 0;
      while (i < vec[j].size()){
         str = "";
         while (i < vec[j].size() && vec[j][i] != ' '){
            str += vec[j][i];
            i++;
         }
         i++;
         if (str != ""){
            check[str] = true;
         }
      }
      for(int k = 0; k < set.size(); k++){
         if (set[k].second != false && check[set[k].first] == false){
            set[k].second = false;
         }
         else if (set[k].second != false && check[set[k].first] == true){
            check[set[k].first] = false;
         }
      }
   }
   for (int k = 0; k < set.size(); k++){
      if (set[k].second == true){
         count++;
      }
   }
   return count;
}
int main(){
   vector<string> vec;
   vec.push_back("Honesty is the best policy");
   vec.push_back("policy varies from company to company");
   vec.push_back("Employee should follow the policy of a company");
   int size = vec.size();
   cout<<"Count of words that are present in all the given sentences are: "<<words_sentences(vec, size);
   return 0;
}

出力

上記のコードを実行すると、次の出力が生成されます-

Count of words that are present in all the given sentences are: 1

  1. C++で指定されたN個の範囲のすべての要素をカバーする範囲を検索します

    LとRを含むn個の範囲があるとします。他のすべてのn– 1範囲をカバーする範囲に基づいて、0のインデックスをチェックまたは見つける必要があります。そのような範囲がない場合は、-1を表示します。たとえば、L =[2、4、3、1]、R =[4、6、7、9]の場合、出力は3になります。つまり、3番目のインデックス(1〜9)の範囲がすべてをカバーすることを意味します。他のn–1の範囲の要素。 すべてのLポイントとRポイントが異なるため、最小のLポイントと最大のRポイントの範囲を見つけます。両方が同じ範囲である場合は、他のすべての範囲がその範囲内にあることを示します。それ以外の場合は不可能です。 例

  2. C ++で指定された文字列内の「1(0+)1」のすべてのパターンを検索します

    文字列に1(0+)1のようなパターンがあるとします。ここで、(0+)は、空でない連続した1の出現を示します。すべてのパターンを見つける必要があります。パターンは重複する可能性があります。文字列は必ずしもバイナリ文字列である必要はありません。数字と小文字のみを保持できます。文字列が1101001のようなものであるとすると、そのようなパターンが2つあります。 101と1001。 この問題を解決するために、次の手順に従います- 文字列内のすべての文字cを繰り返し処理します cが1の場合、要素が0になるまで繰り返します 0のストリームが終了すると、次の文字が1かどうかを確認します