Easy
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'."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 <= 1001 <= words[i].length <= 100words[i] consist of only lowercase English letters.class Solution {
fun similarPairs(words: Array<String>): Int {
val len = words.size
if (len == 1) {
return 0
}
val alPh = Array(len) { ByteArray(26) }
val map: MutableMap<String, Int> = HashMap()
for (i in 0 until len) {
val word = words[i]
for (c in word.toCharArray()) {
val idx = c.code - 'a'.code
if (alPh[i][idx].toInt() == 0) {
alPh[i][idx]++
}
}
val s = String(alPh[i])
if (map.containsKey(s)) {
map[s] = map[s]!! + 1
} else {
map[s] = 1
}
}
var pairs = 0
for ((_, freq) in map) {
if (freq > 1) {
pairs += freq * (freq - 1) / 2
}
}
return pairs
}
}