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

C++でスワップする最小の文字列


文字列sと、文字列ペア内のインデックスのペアの配列を指定したとします。ここで、pairs [i] =[a、b]は、文字列の2つのインデックス(0-インデックス)を示します。指定されたペアのインデックスの任意のペアで、必要に応じて何度でも文字を交換できます。スワップを使用した後にsを変更できる辞書式最小の文字列を見つける必要があります。したがって、入力がs =“ dcab”およびpairs =[[0,3]、[1,2]]のような場合、出力は“ bacd”になります。 s[0]とs[3]、s ="bcad"を交換してから、s[1]とs[2]、s="bacd"を交換します。

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

  • n:=配列のサイズ、親:=サイズnの配列を作成し、これに-1を入力します

  • サイズnのretという文字列を作成し、これに*

    を入力します。
  • 0からペアのサイズまでの範囲のiの場合

    • u:=ペア[i、0]およびv:=ペア[i、1]

    • uの親がvの親と同じである場合は、次の反復にスキップします

    • parent [uの親]:=vの親

  • サイズnの配列arr1を定義します

  • 0からn– 1の範囲のiの場合:s[i]をarr[parent of i]

    に挿入します
  • 0からn– 1の範囲のiの場合:右から値を読み取ってarr[i]をソートします

  • 0からn– 1 −

    の範囲のiの場合
    • ret [i]:=arr1[iの親]の最後のエントリ

    • arr1[iの親]から最後のノードを削除します

例(C ++)

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

class Solution {
public:
   vector <int> parent;
   int getParent(int x){
      if(parent[x] == -1) return x;
      return parent[x] = getParent(parent[x]);
   }
   string smallestStringWithSwaps(string s, vector<vector<int>>& pairs) {
      int n = s.size();
      parent = vector <int>(n, -1);
      string ret(n, '*');
      for(int i = 0; i < pairs.size(); i++){
         int u = pairs[i][0];
         int v = pairs[i][1];
         if(getParent(u) == getParent(v)) continue;
         parent[getParent(u)] = getParent(v);
      }
      vector < char > arr1[n];
      for(int i = 0; i < n; i++){
         arr1[getParent(i)].push_back(s[i]);
      }
      for(int i = 0; i < n; i++){
         sort(arr1[i].rbegin(), arr1[i].rend());
      }
      for(int i = 0; i < n; i++){
         ret[i] = arr1[getParent(i)].back();
         arr1[getParent(i)].pop_back();
      }
      return ret;
   }
};

入力

"dcab"
[[0,3],[1,2]]

出力

"bacd"

  1. C++でしきい値距離にある近隣の数が最も少ない都市を検索します

    0からn-1までの番号が付けられたn個の都市があるとします。 edge [i] =[fromi、toi、weighti]である配列エッジがある場合、都市fromiとtoiの間の双方向の重み付きエッジを表し、整数の距離しきい値が与えられます。あるパスを介して到達可能で、距離が最大で距離のしきい値である都市の数が最も少ない都市を見つける必要があります。そのような都市が複数ある場合は、最も多い都市を返します。 したがって、入力が-のような場合 nが4で、距離のしきい値も4の場合、出力は3になります。これは- 各都市の距離しきい値=4にある隣接する都市は、- C0 -> [C1, C

  2. C ++でintをstringに変換する方法は?

    Cのitoa関数を使用して、intを文字列に変換できます。 例 #include<iostream> int main() {    int a = 10;    char *intStr = itoa(a);    string str = string(intStr);    cout << str; } 出力 これにより、出力が得られます- 10 これにより、整数が文字列に変換されます。 C ++ 11では、同じ目的で使用できる新しいメソッドto_stringが追加されました。次の