題目
難度:★★☆☆☆
類型:字符串
你將得到一個字符串?dāng)?shù)組 A。
如果經(jīng)過任意次數(shù)的移動,S == T,那么兩個字符串 S 和 T 是特殊等價的。
一次移動包括選擇兩個索引 i 和 j,且 i % 2 == j % 2,交換 S[j] 和 S [i]。
現(xiàn)在規(guī)定,A 中的特殊等價字符串組是 A 的非空子集 S,這樣不在 S 中的任何字符串與 S 中的任何字符串都不是特殊等價的。
返回 A 中特殊等價字符串組的數(shù)量。
提示
1 <= A.length <= 1000
1 <= A[i].length <= 20
所有 A[i] 都具有相同的長度。
所有 A[i] 都只由小寫字母組成。
示例
示例 1
輸入:["a","b","c","a","c","c"]
輸出:3
解釋:3 組 ["a","a"],["b"],["c","c","c"]
示例 2
輸入:["aa","bb","ab","ba"]
輸出:4
解釋:4 組 ["aa"],["bb"],["ab"],["ba"]
示例 3
輸入:["abc","acb","bac","bca","cab","cba"]
輸出:3
解釋:3 組 ["abc","cba"],["acb","bca"],["bac","cab"]
示例 4
輸入:["abcd","cdab","adcb","cbad"]
輸出:1
解釋:1 組 ["abcd","cdab","adcb","cbad"]
解答
特殊等價字符串具有相同的表示,我們要做的是尋找這種表示方式。
我們首先考慮這樣一種情況,如果題目中沒有奇偶位的限制,我們僅需統(tǒng)計所有字符出現(xiàn)的次數(shù),即可判斷兩個字符串是否特殊等價(Counter(s1)==Counter(s2)),這時,相當(dāng)于準(zhǔn)備一個向量,這個向量有26個數(shù)字,每個數(shù)字代表相應(yīng)字母出現(xiàn)次數(shù),我們用這個計數(shù)器向量去表示字符串,只要兩個字符串對應(yīng)的計數(shù)器向量相等,那么這兩個字符串等價;
但是,加上奇偶位的限制后,在奇數(shù)位上的字符,與在偶數(shù)位上的字符不能相互交換,相當(dāng)于奇數(shù)位和偶數(shù)位上的相同字符也要區(qū)別對待,這樣,我們將上述的26維向量加倍到52維,左右兩半部分分別代表奇數(shù)位上所有字符的統(tǒng)計結(jié)果和偶數(shù)位上字符的統(tǒng)計結(jié)果,我們暫且稱之為52維計數(shù)器向量,這個向量其實就成為了特殊等價字符串的表示向量,通過判斷字符串對應(yīng)的52維計數(shù)器向量是否相等,即可判斷兩個字符串是否是特殊等價的。
對于多個字符串,我們要獲得其中一共有多少特殊等價字符串組,可以通過判斷所有字符串對應(yīng)的52維計數(shù)器向量中有多少不同類型即可。
class Solution(object):
def numSpecialEquivGroups(self, A):
def count(A):
c = [0] * 52
for i, letter in enumerate(A):
c[ord(letter) - ord('a') + 26 * (i % 2)] += 1
return tuple(c)
return len({count(word) for word in A})
如有疑問或建議,歡迎評論區(qū)留言~