Prerequisites
Before attempting this problem, you should be comfortable with:
- Hash Map - Using dictionaries to map keys to values for O(1) average lookup time
- Hash Set - Using sets for O(1) membership testing to check if elements belong to a collection
1. Using Hash Map and Hash Set
Intuition
Two sentences are similar if they have the same length and each pair of corresponding words is either identical or defined as similar in the given pairs. To check similarity efficiently, we build a lookup structure: a hash map where each word maps to a set of its similar words. Since similarity is symmetric, we add both directions for each pair. Then we simply iterate through both sentences and verify each word pair using wordToSimilarWords.
Algorithm
- If the two sentences have different lengths, return
false. - Build a hash map
wordToSimilarWordswhere each word maps to a hash set of its similar words.- For each pair
(word1, word2), addword2toword1's set andword1toword2's set.
- For each pair
- For each index
iin the sentences:- If
sentence1[i]equalssentence2[i], continue. - If
sentence2[i]is in the similar words set ofsentence1[i], continue. - Otherwise, return
false(words are not similar).
- If
- Return
true(all word pairs are similar).
class Solution(object):
def areSentencesSimilar(self, sentence1, sentence2, similarPairs):
if len(sentence1) != len(sentence2):
return False
wordToSimilarWords = defaultdict(set)
for word1, word2 in similarPairs:
wordToSimilarWords[word1].add(word2)
wordToSimilarWords[word2].add(word1)
for i in range(len(sentence1)):
if sentence1[i] == sentence2[i] or sentence2[i] in wordToSimilarWords[sentence1[i]]:
continue
return False
return TrueTime & Space Complexity
- Time complexity:
- Space complexity:
Where is the number of words in
sentence1andsentence2, is the length ofsimilarPairs, and is the average length of words insentence1as well assimilarPairs.
Common Pitfalls
Forgetting That Similarity Is Symmetric
When building the lookup structure, a common mistake is only adding one direction of the similarity relationship. If (word1, word2) is a similar pair, then word2 should be accessible from word1 AND word1 should be accessible from word2. Failing to add both directions will cause false negatives when words appear in opposite positions.
Not Checking for Equal Words First
A word is always similar to itself, even if it does not appear in any similarity pair. Forgetting to check if sentence1[i] == sentence2[i] before consulting the similarity map will incorrectly return false for identical words that happen to not be in the pairs list.