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

文字の2つのスタックを空にできるかどうかをチェックするC++プログラム


2n個の文字があり、それぞれに1からnまでの整数が書かれているとします。同じ数字が書かれた文字がちょうど2つあります。これらの文字はm個のスタックに配置され、スタックiには文字stack[i]があります。私たちのタスクは、次の方法ですべてのスタックを空にすることです

  • 2つのスタックを選択し、両方から一番上の文字を削除する必要があります。

  • 削除した文字は、両方に同じ番号が付いている必要があります。

この方法でmスタックを空にできる場合は、trueを出力します。そうでない場合は、falseを返します。

したがって、入力がn =3、m =2、スタック={{2、1、3}、{2、1、3}}の場合、出力はtrueになります。

2つのスタックがあり、各スタックには、それぞれ2、1、3の数字が書かれた文字があります。したがって、2つのスタックから削除して、指定された方法でそれらを空にすることができます。

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

Define one 2D array dp
Define an array tvec
for initialize i := 0, when i < m, update (increase i by 1), do:
   k := size of stacks[i]
   for initialize j := 0, when j < k, update (increase j by 1), do:
      if j < 0, then:
         insert p at the end of dp[stacks[i, j]]
         (increase tvec[p] by 1)
      p := stacks[i, j]
Define an array tp
for initialize i := 1, when i <= n, update (increase i by 1), do:
   Define one queue q
   insert i into q
   while (q is not empty), do:
    if not tp[first element of q] and tvec[first element of q] is same as 0, then:
         for each element next in dp[first element of q], do:
             (decrease tvec[next] by 1)
             insert next into q
         tp[first element of q] := true
   delete first element from q
for initialize i := 1, when i <= n, update (increase i by 1), do:
   if tvec[i] is not equal to 0, then:
return false
return true

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

#include <bits/stdc++.h>
using namespace std;

bool solve(int n, int m, vector<vector<int>> stacks){
   vector<vector<int>> dp(n + 1);
   vector<int> tvec(n + 1);
   for(int i = 0; i < m; i++){
      int k = stacks[i].size();
      int p;
      for(int j = 0; j < k; j++){
         if(j > 0){
            dp[stacks[i][j]].push_back(p);
            tvec[p]++;
         }
         p = stacks[i][j];
      }
   }
   vector<bool> tp(n + 1);
   for(int i = 1; i <= n; i++){
      queue<int> q;
      q.push(i);
      while(!q.empty()){
         if(!tp[q.front()] && tvec[q.front()] == 0){
            for(auto next: dp[q.front()]){
               tvec[next]--;
               q.push(next);
            }
            tp[q.front()]=true;
         }
         q.pop();
      }
   }
   for(int i = 1; i <= n; i++){
      if(tvec[i] != 0){
         return false;
      }
   }
   return true;
}
int main() {
   int n = 3, m = 2;
   vector<vector<int>> stacks = {{2, 1, 3}, {2, 1, 3}};
   cout<< solve(n, m, stacks);
   return 0;
}

入力

3, 2, {{2, 1, 3}, {2, 1, 3}}

出力

1

  1. アレイが回文であるかどうか、またはC++でSTLを使用していないかどうかを確認するプログラム

    n個の整数の配列arr[n]が与えられた場合、タスクは配列が回文であるかどうかを見つけることです。 C++でSTLを使用して指定されたタスクを実行する必要があります。 C ++には、STL(標準テンプレートライブラリ)の機能があります。これは、データ構造と、スタック、キュー、リストなどのいくつかの機能を提供するために使用されるC ++テンプレートクラスのセットです。これらを使用するには、知識が必要です。テンプレートクラスの。 回文は、シーケンスの前または後ろから同じように読み取られるシーケンスです。回文の簡単な例としては、-MADAM、RACECARなどがあります。配列は、以下の例のような

  2. 2つの文字列をチェックするプログラムは、Pythonで文字を交換するかどうかによって等しくなる可能性があります

    2つの小文字の文字列sとtがあり、それらは同じ長さであるとします。 sから1つの文字を選択し、tから別の文字を選択して入れ替えることができます。この操作は何度でも実行できます。最後に、2つの文字列を同じにすることが可能かどうかを確認する必要があります。 したがって、入力がs =abcd t =cdabの場合、出力はTrueになります これを解決するには、次の手順に従います- fre:=sとtの連結文字列に存在する各要素の頻度を含むリスト freのすべての値のリストにある各cntについて、 cnt mod 2が1の場合、 Falseを返す Trueを返す 例 理解を深める