# 力扣已經連續好幾天的題目都是考察並查集的題,
# 今天也不例外,是否為相似字串組就表示一個組,也就是一個連通的區域
# 這道題變向是考察一共有多少個連通區域。
# 首先是並查集的魔板。
class DSU:
def __init__(self,n):
# 初始化一個陣列,初始每個節點都不聯通。
self.father = list(range(n))
# 這裡定義一個數字,表示有連通區域的個數,
# 初始的的時候都不連通,為n
self.num = n
def find(self,x):
# 尋找父節點。
if x != self.father[x]:
# 這裡已經向上迴圈,最後找到最上層的父親節點,也就是x = self.father[x]那個。
# 然後把他的兒子節點的父節點都定義為最上層那個。
self.father[x] = self.find(self.father[x])
return self.father[x]
def union(self,x,y):
# 判斷是否連通,
if not self.is_connected(x,y):
# 進行連通,
self.father[self.find(y)] = self.find(x)
# 注意這裡需要把連通區域的個數減去一。
self.num -= 1
# 判斷是否為連通區域。
def is_connected(self,x,y):
return self.find(x) == self.find(y)
from typing import List
class Solution:
def numSimilarGroups(self, strs: List[str]) -> int:
# 判斷字串的長度。
length = len(strs)
if length <= 1:return length
# 初始化一個並查集。
dsu = DSU(length)
# 雙重遍歷進行判斷。
for i in range(length):
for j in range(i + 1,length):
# 這裡判斷是否為相似字串,如果是的話就將他們連通。
if self.isSimila(strs[i],strs[j]):
# 首先應該先判斷是否連通,這一步判斷在union函式中做了,
dsu.union(i,j)
return dsu.num
# 判斷是否為相似字串函式,只需要統計字串中不相同字元的個數是否為0或者2就好了。
def isSimila(self,str1,str2):
count = 0
for i in range(len(str1)):
if str1[i] != str2[i]:
count += 1
return count == 2 or count == 0