893. 特殊等價字符串組(Python)

題目

難度:★★☆☆☆
類型:字符串

你將得到一個字符串?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ū)留言~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容