列表

详情


893. 特殊等价字符串组

给你一个字符串数组 words

一步操作中,你可以交换字符串 words[i] 的任意两个偶数下标对应的字符或任意两个奇数下标对应的字符。

对两个字符串 words[i]words[j] 而言,如果经过任意次数的操作,words[i] == words[j] ,那么这两个字符串是 特殊等价 的。

现在规定,words 一组特殊等价字符串 就是 words 的一个同时满足下述条件的非空子集:

返回 words特殊等价字符串组 的数量。

 

示例 1:

输入:words = ["abcd","cdab","cbad","xyzz","zzxy","zzyx"]
输出:3
解释:
其中一组为 ["abcd", "cdab", "cbad"],因为它们是成对的特殊等价字符串,且没有其他字符串与这些字符串特殊等价。
另外两组分别是 ["xyzz", "zzxy"] 和 ["zzyx"]。特别需要注意的是,"zzxy" 不与 "zzyx" 特殊等价。

示例 2:

输入:words = ["abc","acb","bac","bca","cab","cba"]
输出:3
解释:3 组 ["abc","cba"],["acb","bca"],["bac","cab"]

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int numSpecialEquivGroups(vector<string>& words) { } };

golang 解法, 执行用时: 4 ms, 内存消耗: 3.2 MB, 提交时间: 2021-06-10 17:45:33

func numSpecialEquivGroups(words []string) int {
    ans := make(map[string]bool)
    for _, word := range words {
        ans[count(word)] = true
    }
    return len(ans)
}

// 偶数位和奇数位分别记录
func count(word string) string {
	ans := make([]rune, 52)
	for i := range word {
		ans[int(word[i]-'a') + 26 * (i%2)]++
	}
	return string(ans)
}

python3 解法, 执行用时: 60 ms, 内存消耗: 15.3 MB, 提交时间: 2021-06-10 17:33:00

class Solution:
    def numSpecialEquivGroups(self, words: List[str]) -> int:
        def count(word: str):
            ans = [0] * 52
            for i, c in enumerate(word):
                ans[ord(c)-ord('a') + 26 * (i%2)] += 1
            return tuple(ans)
        return len({count(word) for word in words})

上一题