LeetCode: 893. Groups of Special-Equivalent Strings

题目描述

You are given an array A of strings.

Two strings S and T are special-equivalent if after any number of moves, S == T.

A move consists of choosing two indices i and j with i % 2 == j % 2, and swapping S[i] with S[j].

Now, a group of special-equivalent strings from A is a non-empty subset S of A such that any string not in S is not special-equivalent with any string in S.

Return the number of groups of special-equivalent strings from A.

Example 1:

Input: ["a","b","c","a","c","c"]
Output: 3
Explanation: 3 groups ["a","a"], ["b"], ["c","c","c"]

Example 2:

Input: ["aa","bb","ab","ba"]
Output: 4
Explanation: 4 groups ["aa"], ["bb"], ["ab"], ["ba"]

Example 3:

Input: ["abc","acb","bac","bca","cab","cba"]
Output: 3
Explanation: 3 groups ["abc","cba"], ["acb","bca"], ["bac","cab"]

Example 4:

Input: ["abcd","cdab","adcb","cbad"]
Output: 1
Explanation: 1 group ["abcd","cdab","adcb","cbad"]

Note:

1 <= A.length <= 1000
1 <= A[i].length <= 20
All A[i] have the same length.
All A[i] consist of only lowercase letters.

解题思路

统计奇数位和偶数位的个字符出现的次数,如果 S0 串和 S1 串统计的结果相同,则它们是 special-equivalent 的。

AC 代码

class Solution {
    map<char, int> countChar(string str)
    {
        map<char, int> charCounter;

        // 统计偶数位字符
        for(size_t i = 0; i < str.size(); i += 2)
        {
            ++charCounter[str[i]];
        }

        // 统计奇数位字符
        for(size_t i = 1; i < str.size(); i += 2)
        {
            ++charCounter[-str[i]];
        }

        return charCounter;
    }
public:
    int numSpecialEquivGroups(vector<string>& A) {
        set<map<char, int>> ans;
        for(string S : A)
        {
            ans.insert(countChar(S));
        }

        return ans.size();
    }
};