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

C++での最小ウィンドウサブストリング


文字列SとTがあるとします。Tのすべての文字を含む最小ウィンドウをSで見つける必要があります。したがって、入力が「ABHDAXCVBAGTXATYCB」のようで、T =「ABC」の場合、結果は次のようになります。 CVBA」。

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

  • 1つのマップを作成するm

  • xの頻度をmに格納する

  • 長さ:=sのサイズ、左:=0、右:=0、ansLeft:=0、ansRight:=0

  • カウンター:=xのサイズ、フラグ:=false、ans:=空の文字列

  • 高さ

    • c:=s [right]

    • cがmに存在する場合、

      • m [c]> 0の場合、カウンターを1減らします

      • m[c]を1減らします

    • カウンター=0で左<=右

      • 右の場合–左+1<=長さ

        • 長さ:=右–左+ 1

        • フラグ:=true

        • ansLeft:=左、ansRight:=右

      • 左=右の場合、ループを解除します

      • c:=s[左]

      • cがmに存在する場合は、m[c]を1増やします

      • m [c]> 0の場合、カウンターを1増やします

      • 左に1増加

    • 右に1増加

  • フラグがfalseの場合は、ansを返します

  • それ以外の場合、ansLeftからansRightの範囲にあるiの場合、ansをs [i]

    増やします。
  • ansを返す

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   string minWindow(string s, string x) {
      map <char, int> m;
      for(int i =0;i<x.size();i++)m[x[i]]++;
      int length = s.size();
      int left = 0, right = 0 , ansLeft = 0, ansRight = 0;
      int counter = x.size();
      bool flag = false;
      string ans = "";
      while(right<s.size()){
         char c = s[right];
         if(m.find(c)!=m.end()){
            if(m[c]>0)counter--;
            m[c]--;
         }
         while(counter == 0 && left<=right){
            if(right-left+1 <=length){
               length = right-left+1;
               flag = true;
               ansLeft = left;
               ansRight = right;
            }
            if(left == right)break;
            c = s[left];
            if(m.find(c)!=m.end()){
               m[c]++;
               if(m[c]>0)counter++;
            }
            left++;
         }
         right++;
      }
      if(!flag)return ans;
      else
      for(int i =ansLeft;i<=ansRight;i++)ans+=s[i];
      return ans;
   }
};
main(){
   Solution ob;
   cout << (ob.minWindow("ABHDAXCVBAGTXATYCB", "ABC"));
}

入力

"ABHDAXCVBAGTXATYCB"
"ABC"

出力

CVBA

  1. C++での最小の騎士の動き

    座標が-無限大から+無限大までの無限のチェス盤があり、正方形[0、0]に騎士がいるとします。騎士は、以下に示すように、8つの可能な動きをすることができます。それぞれの動きは、基本方向に2マス、次に直交方向に1マスです。 騎士を正方形[x、y]に移動するために必要な最小ステップ数を見つける必要があります。答えが存在することが保証されています。 したがって、入力がx=5およびy=5の場合、出力は4になります。これは[0,0]→[2,1]→[4,2]→[3,4]→[のようになります。 5,5] これを解決するには、次の手順に従います- マップを定義するm Solve()とい

  2. Window上のc++のトップIDEは何ですか?

    大きなプロジェクトは、単なるテキストエディタでは管理が困難です。このような場合にIDEを使用すると、生産性が向上し、フラストレーションが軽減される可能性があります。 IDEにはさまざまな種類があり、ニーズに合ったものを選択する必要があります。これがWindowに最適なC/C++IDEのリストです。 Visual Studio − Microsoftが開発したIDEです。このIDEは、Windows上でC ++のプログラムを構築、開発、およびプロファイリングするためのクラス最高のツールを備えています。 Visual Studioには、多数のプラグインを備えた巨大なプラグインストアもありま