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

C++で最大K個の異なる文字を含む最長のサブストリング


文字列があるとします。最大でk個の異なる文字を含む最長の部分文字列Tの長さを計算する必要があります。

したがって、入力がs ="eceba"、k =2の場合、Tは "ece"であり、長さは3であるため、出力は3になります。

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

  • 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を返す

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

#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;
   }
};
main() {
   Solution ob;
   cout << (ob.lengthOfLongestSubstringKDistinct("eceba", 2));
}

入力

"eceba", 2

出力

3

  1. C++で最も水が多いコンテナ

    コンテナの壁の高さの配列が与えられます。目標は、最大量の水を入れることができる容器を見つけることです。壁の高さは配列の要素であるため、壁の間の距離は2つの壁の間の幅と見なされます。たとえば、高さArr[i]とArr[j]の壁の間にj-i幅があります(0 <=i

  2. 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) テーブルのサイズが<