Question:

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"]
  2. Output: 3
  3. Explanation: 3 groups ["a","a"], ["b"], ["c","c","c"]
  4. Input: ["abcd","cdab","adcb","cbad"]
  5. Output: 1
  6. Explanation: 1 group ["abcd","cdab","adcb","cbad"]
Input: ["aa","bb","ab","ba"]
Output: 4
Explanation: 4 groups ["aa"], ["bb"], ["ab"], ["ba"]

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

Solution:

/**
 * @param {string[]} A
 * @return {number}
 */
var numSpecialEquivGroups = function(A) {
  return A.reduce((prev, curr) => {
      let left = "";
      let right = "";

      for (let i=0; i<curr.length; i++) {
        i % 2 === 0 ? left += curr[i] : right += curr[i];
      }
      left = [...left].sort().join("");
      right = [...right].sort().join("");

      for (let i = 0; i < prev.length; i++) {
          if (prev[i][0] === left && prev[i][1] === right) {
              return prev
          }
      }

      prev.push([left,right]);
      return prev;
  }, []).length;
};

Runtime: 96 ms, faster than 19.32% of JavaScript online submissions for Groups of Special-Equivalent Strings.

题目啥玩意~