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

C++での部分文字列の最大出現数


文字列sがあるとすると、次のルールを満たすサブ文字列の最大出現回数を見つける必要があります-

  • サブストリング内の個別の文字の数は、maxLetters以下である必要があります。
  • 部分文字列のサイズは、minSizeからmaxSizeの範囲内である必要があります。

したがって、入力が−“ aababcaab”、maxLetters =2、minSize =3、maxSize =4の場合、出力は2になります。サブストリング "aab"は、元のストリングに2回出現します。これは、2つの一意の文字とサイズ3(minSizeとmaxSizeの間)の条件を満たします。

これを解決するには、次の手順に従います-

  • マップを定義するm
  • minSizeからmaxSizeの範囲のszの場合
    • マップxを作成し、一時を作成します。最初は空です
    • 0からsz–1の範囲のiの場合
      • x[s[i]]を1増やします
      • temp:=temp + s [i]
    • jが0の場合、iはszからs – 1のサイズの範囲で、iとjを1増やします
      • x <=maxLettersのサイズの場合、m[temp]を1増やします
      • x[temp[0]]を1つ減らします
      • x [temp [0]]が0の場合、xからtemp[0]を削除します
      • temp自体からtempの1番目と2番目の要素を削除します
      • x[s[i]]を1増やします
      • temp:=temp + s [i]
    • x <=maxLettersのサイズの場合、m[temp]を1増やします
  • ans:=0
  • マップmにはいくつかの要素がありますが、
    • ans:=ansの最大値とi番目のキーと値のペアの値
  • 回答を返す
例(C ++)

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int maxFreq(string s, int maxLetters, int minSize, int maxSize) {
      unordered_map <string ,int > m;
      for(int sz = minSize; sz <= minSize; sz++){
         unordered_map <char, int> x;
         string temp ="";
         for(int i = 0; i < sz; i++){
            x[s[i]]++;
            temp += s[i];
         }
         for(int j = 0, i = sz; i < s.size(); i++, j++){
            if(x.size() <= maxLetters){
               m[temp]++;
            }
            x[temp[0]]--;
            if(x[temp[0]] == 0)x.erase(temp[0]);
            temp.erase(temp.begin(),temp.begin() + 1);
            x[s[i]]++;
            temp += s[i];
         }
         if(x.size() <= maxLetters){
            m[temp]++;
         }
      }
      int ans = 0;
      unordered_map <string ,int > :: iterator i = m.begin();
      while(i != m.end()){
         ans = max (ans, i->second);
         i++;
      }
      return ans;
   }
};
main(){
   Solution ob;
   cout << (ob.maxFreq("aababcaab",2,3,4));
}

入力

"aababcaab"
2
3
4

出力

2

  1. C++五胞体数

    五胞体数は、パスカルの三角形の5番目の数として表されます。ご存知のように、これは5番目の数字です。つまり、パスカルの三角形に少なくとも5つの数字が必要です。したがって、このシリーズの最初の数字は 1 4 6 4 1から始まります。 パスカルの三角形の4行目。したがって、このチュートリアルでは、たとえば、n番目の五胞体数を見つける必要があります Input : 1 Output : 1 Input : 4 Output : 35 次の図から出力を確認できます- この問題については、可能な限り、これは一種のシリーズであるため、ソリューションでこのシリーズのパターンを見つけようと

  2. 最大ベンド数のC++パス長

    二分木が与えられる問題を解決するため。次に、曲がりの数が最大のパスを見つける必要があります。つまり、パスの方向が左から右に、またはその逆に変化する場合、たとえば、曲がりが考慮されます 入力- 出力- 6 このアプローチでは、ツリーをトラバースして、以前の動きを追跡します。方向が変わった場合は、曲げカウントを更新するだけで、最大値が見つかります。 解決策を見つけるためのアプローチ このアプローチでは、すべてのパスをトラバースし、回答を更新するベンドの最大数を見つけます。 例 #include <bits/stdc++.h> using namespace std; s