如果交換字串 x 中的兩個不同位置的字母,使得它和字串 y 相等,那麼稱 x 和 y兩個字串相似。如果這兩個字串本身是相等的,那它們也是相似的。
例如,「tars」 和 「rats」 是相似的 (交換 0 與 2 的位置); 「rats」 和 「arts」 也是相似的,但是
「star」 不與 「tars」,「rats」,或 「arts」 相似。
總之,它們通過相似性形成了兩個關聯組: 和 。注意,「tars」 和
「arts」 是在同一組中,即使它們並不相似。形式上,對每個組而言,要確定乙個單詞在組中,只需要這個詞和該組中至少乙個單詞相似。
給你乙個字串列表 strs。列表中的每個字串都是 strs 中其它所有字串的乙個字母異位詞。請問 strs 中有多少個相似字串組?
示例 1:平平無奇並查集輸入:strs = [「tars」,「rats」,「arts」,「star」] 輸出:2 示例 2:
輸入:strs = [「omv」,「ovm」] 輸出:1
如何判斷相似:
怎樣用並查集:
中等難度把,配不上困難。
classuf:
def__init__
(self, n)
: self.pre =
list
(range
(n))
self.sz =[1
]* n
self.count = n # 當前連通分量的數目
deffind
(self, x)
:while x != self.pre[x]
: self.pre[x]
= self.pre[self.pre[x]
] x = self.pre[x]
return x
defunion
(self, fx, fy)
:if self.pre[fx]
< self.pre[fy]
: fx, fy = fy, fx
self.pre[fy]
= self.pre[fx]
self.sz[fx]
+= self.sz[fy]
self.count -=
1class
solution
:def
numsimilargroups
(self, strs: list[
str])-
>
int:
defissimilar
(s1, s2):if
len(s1)
!=len
(s2)
:return
false
if s1 == s2:
return
true
count1, count2 =
,[] different =
0for i in
range
(len
(s1)):
if s1[i]
!= s2[i]
: different +=
1return
true
if different ==
2else
false
n =len(strs)
uf = uf(n)
for i in
range
(n):
for j in
range
(i+1
, n)
:if issimilar(strs[i]
, strs[j]):
fx, fy = uf.find(i)
, uf.find(j)
if fx != fy:
uf.union(fx, fy)
return uf.count
839 相似字串組
839.相似字串組 如果交換字串x中的兩個不同位置的字母,使得它和字串y相等,那麼稱x和y兩個字串相似。如果這兩個字串本身是相等的,那它們也是相似的。例如,tars 和 rats 是相似的 交換0與2的位置 rats 和 arts 也是相似的,但是 star 不與 tars rats 或 arts ...
839 相似字串組
難度困難93 如果交換字串x中的兩個不同位置的字母,使得它和字串y相等,那麼稱x和y兩個字串相似。如果這兩個字串本身是相等的,那它們也是相似的。例如,tars 和 rats 是相似的 交換0與2的位置 rats 和 arts 也是相似的,但是 star 不與 tars rats 或 arts 相似。...
839 相似字串組
如果交換字串x中的兩個不同位置的字母,使得它和字串y相等,那麼稱x和y兩個字串相似。如果這兩個字串本身是相等的,那它們也是相似的。例如,tars 和 rats 是相似的 交換0與2的位置 rats 和 arts 也是相似的,但是 star 不與 tars rats 或 arts 相似。總之,它們通過...