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

文字列kの距離をC++で並べ替える


空でない文字列sと整数kがあるとします。同じ文字が少なくとも互いに距離kになるように、文字列を再配置する必要があります。指定された文字列は小文字です。文字列を再配置する方法がない場合は、空の文字列になります。

したがって、入力がs ="aabbcc"、k =3の場合、同じ文字が少なくとも互いに3の距離にあるため、出力は"abcabc"になります。

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

  • ret:=空の文字列

  • 1つのマップを定義するm

  • n:=sのサイズ

  • 初期化i:=0の場合、i

    • (m [s [i]]を1増やします)

  • 1つの優先キューpqを定義する

  • キーと値のペアごとに、mでそれを実行します-

    • temp:=キーとその値のペア

    • 温度をpqに挿入

    • (1つ増やします)

  • 1つのdequedqを定義する

  • (pqが空ではない)間、-

    • curr:=pqの先頭

    • pqから要素を削除する

    • ret:=ret + curr.first

    • (curr.secondを1減らします)

    • dqの最後にcurrを挿入します

    • dqのサイズ>=kの場合、-

      • curr:=dqの最初の要素

      • dqからフロント要素を削除します

      • curr.second> 0の場合、-

        • currをpqに挿入します

  • (dqが空ではなく、dqの最初の要素が0と同じである場合)、do −

    • dqからフロント要素を削除します

  • return(dqが空の場合は、ret、それ以外の場合は空白の文字列)

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

#include <bits/stdc++.h>
using namespace std;
struct Comparator {
   bool operator()(pair<char, int> a, pair<char, int> b) {
      return !(a.second > b.second);
   }
};
class Solution {
public:
   string rearrangeString(string s, int k) {
      string ret = "";
      unordered_map<char, int> m;
      int n = s.size();
      for (int i = 0; i < n; i++) {
         m[s[i]]++;
      }
      unordered_map<char, int>::iterator it = m.begin();
      priority_queue<pair<char, int<, vector<pair<char, int>>,
      Comparator> pq;
      while (it != m.end()) {
         pair<char, int> temp = {it->first, it->second};
         pq.push(temp);
         it++;
      }
      deque<pair<char, int>> dq;
      while (!pq.empty()) {
         pair<char, int> curr = pq.top();
         pq.pop();
         ret += curr.first;
         curr.second--;
         dq.push_back(curr);
         // cout << ret << " " << dq.size() << endl;
         if (dq.size() >= k) {
            curr = dq.front();
            dq.pop_front();
            if (curr.second > 0)
            pq.push(curr);
         }
      }
      while (!dq.empty() && dq.front().second == 0)
         dq.pop_front();
      return dq.empty() ? ret : "";
   }
};
main() {
   Solution ob;
   cout << (ob.rearrangeString("aabbcc", 3));
}

入力

"aabbcc", 3

出力

bacbac

  1. C++での文字列のトークン化

    このセクションでは、C++で文字列をトークン化する方法を説明します。 Cでは、文字配列にstrtok()関数を使用できます。ここに文字列クラスがあります。次に、その文字列から区切り文字を使用して文字列を切り取る方法を説明します。 C ++機能を使用するには、文字列を文字列ストリームに変換する必要があります。次に、getline()関数を使用して、タスクを実行できます。 getline()関数は、文字列ストリーム、出力を送信するための別の文字列、およびストリームのスキャンを停止するための区切り文字を受け取ります。 関数がどのように機能しているかを理解するために、次の例を見てみましょう。 サン

  2. C ++で文字列をトークン化しますか?

    最初の方法は、文字列ストリームを使用して、スペースで区切られた単語を読み取ることです。これは少し制限されていますが、適切なチェックを提供すれば、タスクはかなりうまくいきます。 例 #include <vector> #include <string> #include <sstream> using namespace std; int main() {    string str("Hello from the dark side");    string tmp; // A string