You are given a 0-indexed string array words
.
Two strings are similar if they consist of the same characters.
"abca"
and "cba"
are similar since both consist of characters 'a'
, 'b'
, and 'c'
. However, "abacba"
and "bcfd"
are not similar since they do not consist of the same characters.Return the number of pairs (i, j)
such that 0 <= i < j <= word.length - 1
and the two strings words[i]
and words[j]
are similar.
Example 1:
Input: words = ["aba","aabb","abcd","bac","aabc"]
Output: 2
Explanation: There are 2 pairs that satisfy the conditions:
- i = 0 and j = 1 : both words[0] and words[1] only consist of characters 'a' and 'b'.
- i = 3 and j = 4 : both words[3] and words[4] only consist of characters 'a', 'b', and 'c'.
Example 2:
Input: words = ["aabb","ab","ba"]
Output: 3
Explanation: There are 3 pairs that satisfy the conditions:
- i = 0 and j = 1 : both words[0] and words[1] only consist of characters 'a' and 'b'.
- i = 0 and j = 2 : both words[0] and words[2] only consist of characters 'a' and 'b'.
- i = 1 and j = 2 : both words[1] and words[2] only consist of characters 'a' and 'b'.
Example 3:
Input: words = ["nba","cba","dba"]
Output: 0
Explanation: Since there does not exist any pair that satisfies the conditions, we return 0.
Constraints:
1 <= words.length <= 100
1 <= words[i].length <= 100
words[i]
consist of only lowercase English letters.A brute-force approach involves iterating through all possible pairs of words and, for each pair, checking if they are similar. To check for similarity, we can convert each word into a set of characters and then compare if the sets are equal.
def similar_pairs_brute_force(words):
count = 0
n = len(words)
for i in range(n):
for j in range(i + 1, n):
if set(words[i]) == set(words[j]):
count += 1
return count
To optimize, we can precompute the set of characters for each word and store it in a canonical form (e.g., a sorted string of unique characters). Then, we can use a hash map to count the occurrences of each canonical form. Finally, we iterate through the hash map and count the number of pairs for each canonical form.
def similar_pairs_optimal(words):
counts = {}
for word in words:
canonical = "".join(sorted(set(word)))
counts[canonical] = counts.get(canonical, 0) + 1
total_pairs = 0
for count in counts.values():
total_pairs += count * (count - 1) // 2
return total_pairs
words
is empty, return 0.