두 개의 배열 words1, words2가 주어졌다고 가정하고 이들은 문장으로 간주되며 유사한 단어 쌍의 목록은 두 문장이 유사한지 여부를 확인해야 합니다. 따라서 입력이 words1 =["great", "acting", "skills"] 및 words2 =["fine", "drama", "talent"]인 경우 유사한 단어 쌍이 =[["훌륭하다", "좋다"], ["좋다", "좋다"], ["연기","드라마"], ["실력","재능"]].
유사성 관계는 전이적입니다. 예를 들어 "훌륭하다"와 "좋다"가 비슷하고 "좋다"와 "좋다"가 비슷하면 "훌륭하다"와 "좋다"도 비슷합니다. 그리고 유사도도 대칭입니다. 따라서 "Great"와 "fine"이 유사한 것은 "fine"과 동일하고 "Great"는 유사합니다. 단어는 항상 그 자체와 유사합니다. 마지막으로, 문장은 단어 수가 같은 경우에만 유사할 수 있습니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
하나의 상위 맵, 다른 맵 ID를 정의합니다.
-
getParent() 함수를 정의하면 x가 필요합니다.
-
x가 부모에 없으면 -
-
x를 반환
-
-
부모[x] :=getParent(부모[x])
-
부모 반환[x]
-
Unionn() 함수를 정의하면, b,
-
parentA :=getParent(idx[a])
-
parentB :=getParent(idx[b])
-
parentA가 parentB와 같으면 -
-
반환
-
-
부모[부모A] :=부모B
-
주요 방법에서 다음을 수행하십시오 -
-
word1의 크기가 words2의 크기와 같지 않으면 -
-
거짓 반환
-
-
n :=단어의 크기1
-
카운터 :=1
-
initialize i :=0의 경우, i
-
words1[i]이 idx에 없으면 -
-
idx[words1[i]] :=카운터, 카운터를 1 증가
-
-
-
initialize i :=0의 경우, i
-
words2[i]가 idx에 없으면 -
-
idx[words2[i]] :=카운터, 카운터를 1 증가
-
-
-
initialize i :=0, i <쌍의 크기일 때 업데이트(i 1만큼 증가), 수행 -
-
u :=쌍[i,0]
-
v :=쌍[i,1]
-
idx에 없으면 -
-
idx[u] :=카운터, 카운터를 1 증가
-
-
v가 idx에 없으면 -
-
idx[v] :=카운터, 카운터를 1 증가
-
-
유니온(u, v)
-
-
initialize i :=0의 경우, i
-
유 :=단어1[i]
-
v :=단어2[i]
-
u가 v와 같으면 -
-
다음 부분은 무시하고 다음 반복으로 건너뜁니다.
-
-
getParent(idx[u])가 getParent(idx[v])와 같지 않으면 -
-
거짓 반환
-
-
-
true를 반환
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h> using namespace std; class Solution { public: unordered_map<int, int> parent; unordered_map<string, int> idx; int getParent(int x){ if (!parent.count(x)) return x; return parent[x] = getParent(parent[x]); } void unionn(string a, string b){ int parentA = getParent(idx[a]); int parentB = getParent(idx[b]); if (parentA == parentB) return; parent[parentA] = parentB; } bool areSentencesSimilarTwo(vector<string>& words1, vector<string>& words2, vector<vector<string> >& pairs){ if (words1.size() != words2.size()) return false; int n = words1.size(); int counter = 1; for (int i = 0; i < n; i++) { if (!idx.count(words1[i])) { idx[words1[i]] = counter++; } } for (int i = 0; i < n; i++) { if (!idx.count(words2[i])) { idx[words2[i]] = counter++; } } for (int i = 0; i < pairs.size(); i++) { string u = pairs[i][0]; string v = pairs[i][1]; if (!idx.count(u)) { idx[u] = counter++; } if (!idx.count(v)) { idx[v] = counter++; } unionn(u, v); } for (int i = 0; i < n; i++) { string u = words1[i]; string v = words2[i]; if (u == v) continue; if (getParent(idx[u]) != getParent(idx[v])) return false; } return true; } }; main(){ Solution ob; vector<string> v = { "great", "acting", "skills" }, v1 = { "fine", "drama", "talent" }; vector<vector<string> > v2 = { { "great", "good" }, { "fine", "good" }, { "drama", "acting" }, { "skills", "talent" } }; cout << (ob.areSentencesSimilarTwo(v, v1, v2)); }
입력
{"great","acting","skills"}, {"fine","drama","talent"}, {{"great","good"},{"fine","good"},{"drama","acting"},{"skills","talent"}}
출력
1