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

単語がC++で並べ替えられていると見なすことができるようにアルファベット順を検索します


単語の配列があるとすると、英語のアルファベットのアルファベット順を見つけて、指定された単語が昇順で並べ替えられていると見なすことができるようにする必要があります。そのような順序が存在する場合は、「不可能」を返します。

したがって、入力がwords =["efgh"、 "wxyz"]の場合、出力はzyxvutsrqponmlkjihgfewdcba

になります。

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

  • アルファベット:=26
  • n:=vのサイズ
  • nが1と同じ場合、-
    • 「abcdefghijklmnopqrstuvwxyz」を表示します
    • 戻る
  • サイズがALPHABETの配列調整を定義します
  • サイズがALPHABETの配列を定義し、0で埋めます
  • pre:=v [0]
  • iを初期化する場合:=1、i
  • s:=v [i]
  • 0から最小(preのサイズとsのサイズ)の範囲のjの場合-1 −
    • s[j]がpre[j]と等しくない場合、-
      • ループから抜け出す
    • j
    • s[j]を挿入-adjの最後に「a」のASCII[pre[j]-「a」のASCII]
  • in [s [j] --ASCIIof'a']を1増やします
  • pre:=s
  • 次の部分を無視し、次の反復にスキップします
  • preのサイズ>sのサイズの場合、-
    • 「不可能」を表示する
    • 戻る
  • pre:=s
  • 1つのスタックmy_stackを定義します
  • iを初期化する場合:=0、i
  • in [i]が0と同じ場合、-
    • iをmy_stackに挿入
  • 配列を定義する
  • サイズの配列visを定義します:26。falseで埋めます
  • (my_stackが空ではない)間、-
      を実行します
    • x:=my_stackの最上位要素
    • my_stackから要素を削除
    • vis [x]:=true
    • 出力の最後に「a」のx+ASCIIを挿入します
    • iを初期化する場合:=0、i
    • vis [adj [x、i]]がゼロ以外の場合、-
      • 次の部分を無視し、次の反復にスキップします
    • ([adj [x、i]]を1つ減らします)
    • in [adj [x、i]]が0と同じ場合、-
      • adj [x、i]をmy_stackに挿入します
  • iを初期化する場合:=0、i
  • vis [i]がゼロ以外の場合、-
    • 「不可能」を表示する
  • 戻る
  • iを初期化する場合:=0、i
  • ディスプレイアウト[i]
  • 理解を深めるために、次の実装を見てみましょう-

    #include <bits/stdc++.h>
    using namespace std;
    #define ALPHABET 26
    void search_ordering(vector<string> v) {
       int n = v.size();
       if (n == 1) {
          cout << "abcdefghijklmnopqrstuvwxyz";
          return;
       }
       vector<int> adj[ALPHABET];
       vector<int> in(ALPHABET, 0);
       string pre = v[0];
       for (int i = 1; i < n; ++i) {
          string s = v[i];
          int j;
          for (j = 0; j < min(pre.length(), s.length()); ++j)
             if (s[j] != pre[j])
                break;
          if (j < min(pre.length(), s.length())) {
             adj[pre[j] - 'a'].push_back(s[j] - 'a');
             in[s[j] - 'a']++;
             pre = s;
             continue;
          }
          if (pre.length() > s.length()) {
             cout << "Impossible";
             return;
          }
          pre = s;
       }
       stack<int> my_stack;
       for (int i = 0; i < ALPHABET; ++i)
          if (in[i] == 0)
             my_stack.push(i);
       vector<char> out;
       bool vis[26];
       memset(vis, false, sizeof(vis));
       while (!my_stack.empty()) {
          char x = my_stack.top();
          my_stack.pop();
          vis[x] = true;
          out.push_back(x + 'a');
          for (int i = 0; i < adj[x].size(); ++i) {
             if (vis[adj[x][i]])
                continue;
             in[adj[x][i]]--;
             if (in[adj[x][i]] == 0)
                my_stack.push(adj[x][i]);
          }
       }
       for (int i = 0; i < ALPHABET; ++i)
       if (!vis[i]) {
          cout << "Impossible";
          return;
       }
       for (int i = 0; i < out.size(); ++i)
       cout << out[i];
    }
    int main() {
       vector<string> v{"efgh", "wxyz"};
       search_ordering(v);
    }

    入力

    {"efgh", "wxyz"}

    出力

    zyxvutsrqponmlkjihgfewdcba

    1. マンハッタン距離の合計がC++で最小になるような点を見つけます

      K次元空間にn個の異なる点があり、nの値が範囲(2、105)にあり、kの値が範囲(1〜5)にあるとします。結果の点からn点までのマンハッタン距離の合計が最小になるように点を決定する必要があります。 2点P1(x1、y1)とP2(x2、y2)の間のマンハッタン距離は| x1 –x2|です。 + | y1 –y2|。次元が3で、(1、1、1)、(2、2、2)、(3、3、3)のような3つのポイントがあるとすると、出力は(2、2、2)になります。 この問題を解決するには、すべてのK次元の点を並べ替え、各k次元の中央の要素から出力を取得する必要があります。 例 #include<iostrea

    2. xがC++でyを分割するように、指定された範囲で別個のペア(x​​、y)を見つけます

      ここで、興味深い問題が1つあります。ここで、ペア(x、y)が見つかります。ここで、xとyは範囲内にあるため、l <=x、y <=rであり、ペアには1つのプロパティがあり、xの値はyを除算します。 。利用可能なペアが複数ある場合は、1つだけを選択してください。 下限lと2lの値を取得すれば、O(1)時間でこの問題を解決できます。 y / xの最小値は2である可能性があり、範囲内にさらに大きな値が存在する場合は、2が範囲内になります。また、xを増やすと、2xも増えるため、lと2lは、指定された範囲に入る最小のペアになります。 例 #include<iostream> using na