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

Câu đồng nghĩa trong C ++

Giả sử chúng ta có một danh sách các cặp từ đồng nghĩa tương đương và một văn bản câu, chúng ta phải tìm tất cả các câu đồng nghĩa có thể có, chúng được sắp xếp theo từ điển.

Vì vậy, nếu đầu vào giống như các từ đồng nghĩa =[["happy", "joy"], ["sad", "sad"], ["joy", "fun"]] và text ="Hôm nay tôi rất vui nhưng Hôm qua buồn ", thì đầu ra sẽ là [" Hôm nay tôi vui vẻ nhưng hôm qua buồn "," Hôm nay tôi vui nhưng hôm qua buồn "," Hôm nay tôi vui nhưng hôm qua buồn "," Hôm nay tôi vui nhưng là nỗi buồn hôm qua "," Hôm nay tôi vui nhưng hôm qua buồn "," Hôm nay tôi vui nhưng hôm qua là nỗi buồn "]

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

  • Xác định bản đồ gốc, màu và nhómByColor

  • Xác định một hàm find (), điều này sẽ mất s,

  • nếu [s] cha giống với s, thì -

    • cha [s]:=find (cha [s])

  • trả lại [s] cha mẹ

  • Xác định một hàm unionNode (), điều này sẽ lấy a, b,

  • x:=find (a), y:=find (b)

  • nếu x giống y thì -

    • cha [x]:=y

  • Xác định ans mảng

  • Xác định một hàm getString (), điều này sẽ mất t,

  • Xác định tạm thời mảng

  • end:=0

  • curr:=chuỗi trống

  • for end

    • nếu t [end] giống với khoảng trống, thì -

      • chèn cuộn tóc vào cuối nhiệt độ

      • curr:=chuỗi trống

      • Bỏ qua phần sau, chuyển sang phần tiếp theo

    • curr:=curr nối t [end]

  • chèn cuộn tóc vào cuối nhiệt độ

  • trở lại nhiệt độ

  • Định nghĩa một hàm dfs (), hàm này sẽ lấy chuỗi, idx, khởi tạo tạm thời bằng chuỗi trống,

  • nếu idx bằng với kích thước của chuỗi, thì -

    • chèn tạm thời vào cuối ans

    • trở lại

  • hiện tại:=string [idx]

  • nếu dòng điện không có màu thì -

    • dfs (chuỗi, idx + 1, ghép nối tạm thời + hiện tại ((nếu idx + 1 bằng với kích thước của chuỗi thì chuỗi trống, nếu không thì khoảng trống)))

  • Nếu không

    • Xác định một tập hợp x =groupByColor [color [current]]

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

      • dfs (chuỗi, idx + 1, temp + z + ((nếu idx + 1 bằng với kích thước của chuỗi thì chuỗi trống, nếu không thì khoảng trống)))

      • (tăng z lên 1)

  • Xác định một hàm seeGroups ()

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

    • x:=giây của tôi như đã đặt

    • Xác định một tập hợp

    • cho mỗi phần tử z trong x -

      • (tăng i lên 1)

  • Xác định một hàm createSentences (), điều này sẽ lấy một mảng 2D, một chuỗi t khác,

  • n:=kích thước của s

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

    • x:=s [i, 0]

    • y:=s [i, 1]

    • nếu x không có trong phụ huynh thì -

      • nếu y không có trong cha mẹ, thì -

        • unionNode (x, y)

  • c:=1

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

    • x:=s [i, 0]

    • z:=s [i, 1]

    • y:=find (x)

    • nếu y không có màu thì -

      • color [y]:=c

      • (tăng c lên 1)

    • color [x]:=color [y]

    • color [z]:=color [y]

    • nếu màu [x] không có trong groupByColor, thì -

      • Xác định một tập hợp ss

      • chèn x vào ss

      • chèn y vào ss

      • groupByColor [color [x]]:=ss

    • Nếu không

      • chèn x vào groupByColor [color [x]]

      • chèn z vào groupByColor [color [x]]

  • Xác định chuỗi mảng =getString (t)

  • dfs (chuỗi, 0)

  • sắp xếp ans mảng

  • trả lại ans

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<auto< v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
public:
   map <string, string> parent;
   map <string, int> color;
   map <int, set<string<> groupByColor;
   string find(string s){
      if(parent[s] == s)return s;
         parent[s] = find(parent[s]);
      return parent[s];
   }
   void unionNode(string a, string b){
      string x = find(a);
      string y = find(b);
      if(x == y)return;
         parent[x] = y;
   }
   vector <string< ans;
   vector <string< getString(string t){
      vector <string< temp;
      int end = 0;
      string curr = "";
      for(;end < t.size(); end++){
         if(t[end] == ' '){
            temp.push_back(curr);
            curr = "";
            continue;
         }
         curr += t[end];
      }
      temp.push_back(curr);
      return temp;
   }
   void dfs(vector <string< &strings, int idx, string temp = ""){
      if(idx == strings.size()){
         ans.push_back(temp);
         return;
      }
      string current = strings[idx];
      if(color.find(current) == color.end()){
         dfs(strings, idx + 1, temp + current + (idx+1 == strings.size()?"":" "));
      }
      else{
         set <string< x = groupByColor[color[current]];
         set <string< :: iterator z = x.begin();
         while(z != x.end()){
            dfs(strings, idx + 1, temp + *z + (idx+1 == strings.size()?"":" "));
            z++;
         }
      }
   }
   void seeGroups(){
      map <int, set <string< > :: iterator i = groupByColor.begin();
      while(i != groupByColor.end()){
         set <string< x = i->second;
         set <string< :: iterator z = x.begin();
         while(z != x.end()){
            z++;
         }
         cout << endl;
         i++;
      }
   }
   vector<string< generateSentences(vector<vector<string<>& s, string t) {
      int n = s.size();
      for(int i = 0; i < n; i++){
         string x = s[i][0];
         string y = s[i][1];
         if(parent.find(x) == parent.end())parent[x] = x;
            if(parent.find(y) == parent.end())parent[y] = y;
               unionNode(x,y);
      }
      int c = 1;
      for(int i = 0; i < n; i++){
         string x = s[i][0];
         string z = s[i][1];
         string y = find(x);
         if(color.find(y) == color.end()){
            color[y] = c;
            c++;
         }
         color[x] = color[y];
         color[z] = color[y];
         if(groupByColor.find(color[x]) == groupByColor.end()){
            set <string< ss;
            ss.insert(x);
            ss.insert(y);
            groupByColor[color[x]] = ss;
         }
         else{
            groupByColor[color[x]].insert(x);
            groupByColor[color[x]].insert(z);
         }
      }
      vector <string< strings = getString(t);
      dfs(strings, 0);
      sort(ans.begin(), ans.end());
      return ans;
   }
};
main(){
   Solution ob;
   vector<vector<string<> v = {{"happy","joy"},{"sad","sorrow"},{"joy","cheerful"}};
   print_vector(ob.generateSentences(v, "I am happy today but was sad yesterday"));
}

Đầu vào

[["happy","joy"],["sad","sorrow"],["joy","cheerful"]] "I am happy today but was sad yesterday"

Đầu ra

[I am cheerful today but was sad yesterday, I am cheerful today but was sorrow yesterday, I am happy today but was sad yesterday, I am happy today but was sorrow yesterday, I am joy today but was sad yesterday, I am joy today but was sorrow yesterday, ]