leetcode 893. 特殊等價字符串組(待研究)

【題目】893. 特殊等價字符串組

你將得到一個字符串數組 A。
如果經過任意次數的移動,S == T,那麼兩個字符串 S 和 T 是特殊等價的。
一次移動包括選擇兩個索引 i 和 j,且 i % 2 == j % 2,交換 S[j] 和 S [i]。
現在規定,A 中的特殊等價字符串組是 A 的非空子集 S,這樣不在 S 中的任何字符串與 S 中的任何字符串都不是特殊等價的。
返回 A 中特殊等價字符串組的數量。

示例 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"]

提示:
1 <= A.length <= 1000
1 <= A[i].length <= 20
所有 A[i] 都具有相同的長度。
所有 A[i] 都只由小寫字母組成。

【解題思路1】羣論

一次移動包括選擇兩個索引 i 和 j,且 i % 2 == j % 2,交換 S[j] 和 S [i]。 實際上就是說偶數位和偶數位交換,奇數位和奇數位交換
“abcd”,“cdab”,“adcb”,“cbad” 最終都奇數爲交換 或者偶數位交換可以轉成abcd 所以是1組的
“ab”,“ba” a和b兩是奇數和偶數位不相等 是無法交換的 所以是2個

特殊等價的字符串 S:通過找到函數 C 使得 S≡T⟺C(S)=C(T)。
通過交換,可以排列偶數索引字母和奇數索引字母。這些排列的特徵在於字母的數量:所有這樣的排列都有相同的數量,不同的數量會產生不同的排列。
因此,函數 C(S)=(S 中偶數索引字母的數量,其後是 S 中奇數索引字母的數量)成功地刻畫了這一等價關係。
然後統計出滿足 S ∈A 的 C(S) 的數量。

抽象代數的知識 等價關係與劃分 實質是求等價類的數量 關鍵在於如何找到函數C使得C(S) = C(T) 最難的一環就解決了 可以用素數乘積構造唯一性 也可以用字符串排序構造等等 而最可貴的 就是這種化一的思想 找共性的思想 找不同大家都一樣能看出的 但深層次的共性卻很難一下發現

索引下標剛好記錄出現次數,奇數偶數下標分開存

class Solution {
    public int numSpecialEquivGroups(String[] A) {
        Set<String> seen = new HashSet();
        for (String S: A) {
            int[] count = new int[52];
            for (int i = 0; i < S.length(); ++i)
                count[S.charAt(i) - 'a' + 26 * (i % 2)]++;
            seen.add(Arrays.toString(count));
        }
        return seen.size();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章