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番目のキーと値のペアの値
- 回答を返す
理解を深めるために、次の実装を見てみましょう-
#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
-
C++五胞体数
五胞体数は、パスカルの三角形の5番目の数として表されます。ご存知のように、これは5番目の数字です。つまり、パスカルの三角形に少なくとも5つの数字が必要です。したがって、このシリーズの最初の数字は 1 4 6 4 1から始まります。 パスカルの三角形の4行目。したがって、このチュートリアルでは、たとえば、n番目の五胞体数を見つける必要があります Input : 1 Output : 1 Input : 4 Output : 35 次の図から出力を確認できます- この問題については、可能な限り、これは一種のシリーズであるため、ソリューションでこのシリーズのパターンを見つけようと
-
最大ベンド数のC++パス長
二分木が与えられる問題を解決するため。次に、曲がりの数が最大のパスを見つける必要があります。つまり、パスの方向が左から右に、またはその逆に変化する場合、たとえば、曲がりが考慮されます 入力- 出力- 6 このアプローチでは、ツリーをトラバースして、以前の動きを追跡します。方向が変わった場合は、曲げカウントを更新するだけで、最大値が見つかります。 解決策を見つけるためのアプローチ このアプローチでは、すべてのパスをトラバースし、回答を更新するベンドの最大数を見つけます。 例 #include <bits/stdc++.h> using namespace std; s