Computer >> Máy Tính >  >> Lập trình >> C ++

Tìm thứ tự bảng chữ cái sao cho các từ có thể được sắp xếp trong C ++

Giả sử chúng ta có một mảng các từ, chúng ta phải tìm bất kỳ thứ tự chữ cái nào trong bảng chữ cái tiếng Anh để các từ đã cho có thể được coi là sắp xếp theo thứ tự tăng dần, nếu có bất kỳ thứ tự nào như vậy tồn tại, nếu không thì trả về "không thể".

Vì vậy, nếu đầu vào giống như words =["efgh", "wxyz"], thì đầu ra sẽ là zyxvutsrqponmlkjihgfewdcba

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • ALPHABET:=26
  • n:=kích thước của v
  • nếu n giống 1, thì -
    • hiển thị "abcdefghijklmnopqrstuvwxyz"
    • trở lại
  • Xác định điều chỉnh của mảng có kích thước ALPHABET
  • Xác định một mảng có kích thước ALPHABET và điền bằng 0
  • pre:=v [0]
  • để khởi tạo i:=1, khi i
  • s:=v [i]
  • cho j trong phạm vi từ 0 đến tối thiểu là (kích thước của trước và kích thước của s) - 1 -
    • nếu s [j] không bằng pre [j], thì -
      • Ra khỏi vòng lặp
    • nếu j
    • chèn s [j] - ASCII của 'a' vào cuối adj [pre [j] - ASCII của 'a']
  • tăng [s [j] - ASCII của 'a'] thêm 1
  • pre:=s
  • Bỏ qua phần sau, chuyển sang phần lặp tiếp theo
  • nếu kích thước của trước> kích thước của s, thì -
    • hiển thị "Không thể"
    • trở lại
  • pre:=s
  • Xác định một ngăn xếp my_stack
  • để khởi tạo i:=0, khi tôi
  • nếu trong [i] giống 0, thì -
    • chèn tôi vào my_stack
  • Xác định một mảng
  • Xác định một mảng có kích thước:26. fill với false
  • while (my_stack không trống), thực hiện -
    • x:=phần tử hàng đầu của my_stack
    • xóa phần tử khỏi my_stack
    • vis [x]:=true
    • chèn x + ASCII của 'a' vào cuối đoạn văn bản
    • để khởi tạo i:=0, khi i
    • nếu vis [adj [x, i]] khác 0, thì -
      • Bỏ qua phần sau, chuyển sang phần lặp tiếp theo
    • (giảm trong [adj [x, i]] 1)
    • nếu trong [adj [x, i]] giống 0, thì -
      • insert adj [x, i] vào my_stack
  • để khởi tạo i:=0, khi tôi
  • nếu không vis [i] khác 0, thì -
    • hiển thị "Không thể"
  • trở lại
  • để khởi tạo i:=0, khi i
  • hiển thị ra [i]
  • Ví dụ

    Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

    #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);
    }

    Đầu vào

    {"efgh", "wxyz"}

    Đầu ra

    zyxvutsrqponmlkjihgfewdcba