{"id":3714,"date":"2018-08-26T21:50:13","date_gmt":"2018-08-27T04:50:13","guid":{"rendered":"https:\/\/zxi.mytechroad.com\/blog\/?p=3714"},"modified":"2018-08-30T09:25:13","modified_gmt":"2018-08-30T16:25:13","slug":"leetcode-893-groups-of-special-equivalent-strings","status":"publish","type":"post","link":"https:\/\/zxi.mytechroad.com\/blog\/string\/leetcode-893-groups-of-special-equivalent-strings\/","title":{"rendered":"\u82b1\u82b1\u9171 LeetCode 893. Groups of Special-Equivalent Strings"},"content":{"rendered":"<h1><strong>Problem<\/strong><\/h1>\n<p>You are given an array\u00a0<code>A<\/code>\u00a0of strings.<\/p>\n<p>Two strings\u00a0<code>S<\/code>\u00a0and\u00a0<code>T<\/code>\u00a0are\u00a0<em>special-equivalent<\/em>\u00a0if after any number of\u00a0<em>moves<\/em>, S == T.<\/p>\n<p>A\u00a0<em>move<\/em>\u00a0consists of choosing two indices\u00a0<code>i<\/code>\u00a0and\u00a0<code>j<\/code>\u00a0with\u00a0<code>i % 2 == j % 2<\/code>, and swapping\u00a0<code>S[i]<\/code>\u00a0with\u00a0<code>S[j]<\/code>.<\/p>\n<p>Now, a\u00a0<em>group of special-equivalent strings from\u00a0<code>A<\/code><\/em>\u00a0is a\u00a0non-empty subset S of\u00a0<code>A<\/code>\u00a0such that any string not in S\u00a0is not special-equivalent with any string in S.<\/p>\n<p>Return the number of groups of special-equivalent strings from\u00a0<code>A<\/code>.<\/p>\n<p><strong>Example 1:<\/strong><\/p>\n<pre class=\"crayon:false\"><strong>Input: <\/strong><span id=\"example-input-1-1\">[\"a\",\"b\",\"c\",\"a\",\"c\",\"c\"]<\/span>\r\n<strong>Output: <\/strong><span id=\"example-output-1\">3<\/span>\r\n<strong>Explanation<\/strong>: 3 groups [\"a\",\"a\"], [\"b\"], [\"c\",\"c\",\"c\"]\r\n<\/pre>\n<p><strong>Example 2:<\/strong><\/p>\n<pre class=\"crayon:false\"><strong>Input: <\/strong><span id=\"example-input-2-1\">[\"aa\",\"bb\",\"ab\",\"ba\"]<\/span>\r\n<strong>Output: <\/strong><span id=\"example-output-2\">4<\/span>\r\n<strong>Explanation<\/strong>: 4 groups <span id=\"example-input-2-1\">[\"aa\"], [\"bb\"], [\"ab\"], [\"ba\"]<\/span>\r\n<\/pre>\n<p><strong>Example 3:<\/strong><\/p>\n<pre class=\"crayon:false\"><strong>Input: <\/strong><span id=\"example-input-3-1\">[\"abc\",\"acb\",\"bac\",\"bca\",\"cab\",\"cba\"]<\/span>\r\n<strong>Output: <\/strong><span id=\"example-output-3\">3<\/span>\r\n<strong>Explanation<\/strong>: 3 groups [\"abc\",\"cba\"], [\"acb\",\"bca\"], [\"bac\",\"cab\"]\r\n<\/pre>\n<p><strong>Example 4:<\/strong><\/p>\n<pre class=\"crayon:false\"><strong>Input: <\/strong><span id=\"example-input-4-1\">[\"abcd\",\"cdab\",\"adcb\",\"cbad\"]<\/span>\r\n<strong>Output: <\/strong><span id=\"example-output-4\">1<\/span>\r\n<strong>Explanation<\/strong>: 1 group <span id=\"example-input-4-1\">[\"abcd\",\"cdab\",\"adcb\",\"cbad\"]<\/span>\r\n<\/pre>\n<p><strong>Note:<\/strong><\/p>\n<ul>\n<li><code>1 &lt;= A.length &lt;= 1000<\/code><\/li>\n<li><code>1 &lt;= A[i].length &lt;= 20<\/code><\/li>\n<li>All\u00a0<code>A[i]<\/code>\u00a0have the same length.<\/li>\n<li>All\u00a0<code>A[i]<\/code>\u00a0consist of only lowercase letters.<\/li>\n<\/ul>\n<p><ins class=\"adsbygoogle\" style=\"display: block; text-align: center;\" data-ad-layout=\"in-article\" data-ad-format=\"fluid\" data-ad-client=\"ca-pub-2404451723245401\" data-ad-slot=\"7983117522\">\u00a0<\/ins><\/p>\n<h1><strong>Solution: Signature<\/strong><\/h1>\n<p>All Special-Equivalent Strings should have the same signature if we sort all the odd-index characters and all the even-index characters.<\/p>\n<p>E.g.\u00a0[&#8220;abcd&#8221;,&#8221;cdab&#8221;,&#8221;adcb&#8221;,&#8221;cbad&#8221;] are all in the same graph.<\/p>\n<p>&#8220;abcd&#8221;: odd &#8220;ac&#8221;, even: &#8220;bd&#8221;<br \/>\n&#8220;cdab&#8221;: odd &#8220;ac&#8221;, even: &#8220;bd&#8221;<br \/>\n&#8220;adcb&#8221;: odd &#8220;ac&#8221;, even: &#8220;bd&#8221;<br \/>\n&#8220;cbad&#8221;: odd &#8220;ac&#8221;, even: &#8220;bd&#8221;<\/p>\n<p>We can concatenate the odd and even strings to create a hashable signature.<\/p>\n<p>Time complexity: O(n)<\/p>\n<p>Space complexity: O(n)<\/p>\n<div class=\"responsive-tabs\">\n<h2 class=\"tabtitle\">C++<\/h2>\n<div class=\"tabcontent\">\n\n<pre class=\"lang:c++ decode:true\">\/\/ Author: Huahua\r\n\/\/ Running time: 8 ms\r\nclass Solution {\r\npublic:\r\n  int numSpecialEquivGroups(vector&lt;string&gt;&amp; A) {\r\n    unordered_set&lt;string&gt; s;\r\n    for (const string&amp; a : A) {\r\n      string odd;\r\n      string even;\r\n      for (int i = 0; i &lt; a.size(); ++i) {\r\n        if (i % 2)\r\n          odd += a[i];\r\n        else\r\n          even += a[i];\r\n      }\r\n      sort(begin(odd), end(odd));\r\n      sort(begin(even), end(even));\r\n      s.insert(odd + even);\r\n    }\r\n    return s.size();\r\n  }\r\n};<\/pre>\n\n<\/div><h2 class=\"tabtitle\">Java<\/h2>\n<div class=\"tabcontent\">\n\n<pre class=\"lang:java decode:true\">\/\/ Author: Huahua\r\n\/\/ Running time: 16 ms\r\nclass Solution {\r\n  public int numSpecialEquivGroups(String[] A) {\r\n    Set&lt;String&gt; groups = new HashSet&lt;&gt;();\r\n    for (String a: A) {\r\n      char[] odd = new char[(a.length() + 1) \/ 2];\r\n      char[] even = new char[(a.length() + 1) \/ 2];\r\n      for (int i = 0; i &lt; a.length(); ++i) {\r\n        if (i % 2 == 0)\r\n          even[i \/ 2] = a.charAt(i);\r\n        else\r\n          odd[i \/ 2] = a.charAt(i);          \r\n      }\r\n      Arrays.sort(odd);\r\n      Arrays.sort(even);\r\n      String s = new String(odd) + new String(even);\r\n      groups.add(s);\r\n    }\r\n    return groups.size();\r\n  }\r\n}<\/pre>\n\n<\/div><h2 class=\"tabtitle\">Python<\/h2>\n<div class=\"tabcontent\">\n\n<pre class=\"lang:python decode:true \">\"\"\"\r\nAuthor: Huahua\r\nRunning time: 56 ms\r\n\"\"\"\r\nclass Solution:\r\n  def numSpecialEquivGroups(self, A):\r\n    s = set()\r\n    for a in A:\r\n      odd = \"\"\r\n      even = \"\"\r\n      for i, c in enumerate(a):\r\n        if i % 2 == 0:\r\n          odd += c\r\n        else:\r\n          even += c      \r\n      s.add(''.join(sorted(odd) + sorted(even)))\r\n    return len(s)<\/pre>\n\n<\/div><h2 class=\"tabtitle\">Python (1-linear)<\/h2>\n<div class=\"tabcontent\">\n\n<pre class=\"lang:python decode:true\">\"\"\"\r\nAuthor: Huahua\r\nRunning time: 56 ms\r\n\"\"\"\r\nclass Solution:\r\n  def numSpecialEquivGroups(self, A):\r\n    return len(set([''.join(sorted(a[0::2]) + sorted(a[1::2])) for a in A]))<\/pre>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Problem You are given an array\u00a0A\u00a0of strings. Two strings\u00a0S\u00a0and\u00a0T\u00a0are\u00a0special-equivalent\u00a0if after any number of\u00a0moves, S == T. A\u00a0move\u00a0consists of choosing two indices\u00a0i\u00a0and\u00a0j\u00a0with\u00a0i % 2 == j&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[47],"tags":[222,82,388,4],"class_list":["post-3714","post","type-post","status-publish","format-standard","hentry","category-string","tag-easy","tag-hashtable","tag-signature","tag-string","entry","simple"],"_links":{"self":[{"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/posts\/3714","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/comments?post=3714"}],"version-history":[{"count":7,"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/posts\/3714\/revisions"}],"predecessor-version":[{"id":3753,"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/posts\/3714\/revisions\/3753"}],"wp:attachment":[{"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/media?parent=3714"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/categories?post=3714"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/tags?post=3714"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}