C++で最大2つの異なる文字を含む最長のサブストリング
文字列sがあるとします。最大で2つの異なる文字を持つ最長の部分文字列tの長さを見つける必要があります。
したがって、入力が「eceba」のような場合、tは「ece」で長さが3であるため、出力は3になります。
これを解決するには、次の手順に従います-
-
関数lengthOfLongestSubstringKDistinct()を定義します。これには、s、k、
が必要です。 -
ans:=0
-
1つのマップを定義するm
-
n:=sのサイズ、x:=0
-
初期化j:=0、i:=0の場合、j
-
(m [s [j]]を1増やします)
-
m [s [j]]が1と同じ場合、-
-
(xを1増やします)
-
-
(x>kおよびi<=j)、do −
-
(m [s [i]]を1減らします)
-
m [s [i]]が0と同じ場合、-
-
(xを1減らします)
-
-
(iを1増やします)
-
-
ans:=ansとjの最大値-i+ 1
-
-
ansを返す
-
メインの方法から次のようにします
-
lengthOfLongestSubstringKDistinct(s、2)を返す
例
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h> using namespace std; class Solution { public: int lengthOfLongestSubstringKDistinct(string s, int k){ int ans = 0; unordered_map<char, int> m; int n = s.size(); int x = 0; for (int j = 0, i = 0; j < n; j++) { m[s[j]]++; if (m[s[j]] == 1) x++; while (x > k && i <= j) { m[s[i]]--; if (m[s[i]] == 0) x--; i++; } ans = max(ans, j - i + 1); } return ans; } int lengthOfLongestSubstringTwoDistinct(string s){ return lengthOfLongestSubstringKDistinct(s, 2); } }; main(){ Solution ob; cout << (ob.lengthOfLongestSubstringTwoDistinct("eceba")); }
入力
"eceba"
出力
3
-
C++で最も水が多いコンテナ
コンテナの壁の高さの配列が与えられます。目標は、最大量の水を入れることができる容器を見つけることです。壁の高さは配列の要素であるため、壁の間の距離は2つの壁の間の幅と見なされます。たとえば、高さArr[i]とArr[j]の壁の間にj-i幅があります(0 <=i
-
Pythonでk個の異なる文字を含む最長の部分文字列の長さを見つけるプログラム
数値kと別の文字列sがあるとすると、最大でk個の異なる文字を含む最長の部分文字列のサイズを見つける必要があります。 したがって、入力がk =3 s =kolkataの場合、出力は4になります。これは、長さが4のkolkとkataの3つの異なる文字を持つ2つの最長のサブストリングがあるためです。 これを解決するには、次の手順に従います- ans:=0、左:=0 テーブル:=新しいマップ 右の場合は0からs− 1のサイズの範囲であり、do table [s [right]]:=1 +(存在する場合はs [right]、それ以外の場合は0) テーブルのサイズが<