Leetcode: 839. Similar String Groups

Problem Statement

from typing import List


class Solution:
    def numSimilarGroups(self, strs: List[str]) -> int:
        N = len(strs)
        M = len(strs[0])
        p = [i for i in range(N)]

        def find(u):
            if p[u] == u:
                return u
            p[u] = find(p[u])
            return p[u]

        def union(u, v):
            gu = find(u)
            gv = find(v)
            p[gu] = gv

        def is_similar(i, j):
            cnt = 0
            for k in range(M):
                if cnt > 2:
                    return False
                if strs[i][k] != strs[j][k]:
                    cnt += 1
            return cnt == 0 or cnt == 2

        for i in range(N):
            for j in range(i + 1, N):
                if is_similar(i, j):
                    union(i, j)

        comps = set(find(i) for i in range(N))
        return len(comps)


assert Solution().numSimilarGroups(["tars", "rats", "arts", "star"]) == 2
assert Solution().numSimilarGroups(["omv", "ovm"]) == 1