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

Chuỗi được thay đổi nhóm trong C ++

Giả sử chúng ta có một chuỗi, chúng ta có thể "chuyển" từng chữ cái của nó thành chữ cái kế tiếp của nó, do đó:"abc" có thể được đổi thành "bcd". Chúng ta có thể tiếp tục thực hiện thao tác này tạo thành chuỗi:"abc" -> "bcd" -> ... -> "xyz". Nếu chúng ta có một danh sách các chuỗi không trống chỉ chứa các bảng chữ cái viết thường, chúng ta phải nhóm tất cả các chuỗi thuộc cùng một chuỗi dịch chuyển.

Vì vậy, nếu đầu vào là ["abc", "bcd", "acef", "xyz", "az", "ba", "a", "z"], thì đầu ra sẽ là [["abc "," bcd "," xyz "], [" az "," ba "], [" acef "], [" a "," z "]]

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

  • Xác định một bản đồ m

  • Xác định một mảng 2D ret

  • để khởi tạo i:=0, khi i

    • key:=chuỗi trống

    • để khởi tạo j:=1, khi j

      • diff:=string [i, j] - string [i, j - 1]

      • nếu diff <0, thì -

        • diff:=diff + 26

      • key:=key concatenate "#" concatenate diff dưới dạng chuỗi

    • chèn chuỗi [i] vào cuối m [key]

  • đối với mỗi phần tử nó trong m, do -

    • chèn giá trị của nó vào cuối ret

    • (tăng nó lên 1)

  • trả lại ret

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;
void print_vector(vector<vector<auto< > v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << "[";
      for(int j = 0; j <v[i].size(); j++){
         cout << v[i][j] << ", ";
      }
      cout << "],";
   }
   cout << "]"<<endl;
}
class Solution {
public:
   vector<vector<string>> groupStrings(vector<string<& strings) {
      unordered_map<string, vector<string> > m;
      vector<vector<string< > ret;
      for (int i = 0; i < strings.size(); i++) {
         string key = "";
         for (int j = 1; j < strings[i].size(); j++) {
            int diff = strings[i][j] - strings[i][j - 1];
            if (diff < 0)
            diff += 26;
            key += "#" + to_string(diff);
         }
         m[key].push_back(strings[i]);
      }
      unordered_map<string, vector<string< >::iterator it = m.begin();
      while (it != m.end()) {
         ret.push_back(it->second);
         it++;
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<string< v = {"abc","bcd","acef","xyz","az","ba","a","z"};
   print_vector(ob.groupStrings(v));
}

Đầu vào

{"abc","bcd","acef","xyz","az","ba","a","z"}

Đầu ra

[[az, ba, ],[a, z, ],[abc, bcd, xyz, ],[acef, ],]