这是悦乐书的第344次更新,第368篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第209题(顺位题号是893)。

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.

给定一个字符串数组A。

如果在任意数量的移动之后,两个字符串S和T是特殊相等的,S == T。

移动是指选择两个索引i和j,其中i%2 == j%2,并且用S[j]交换S[i]。

现在,S是一个特殊相等字符串组,是A的非空子集,使得不存在于S中(但存在于A中)的任意字符串与S中的任何字符串不是特殊相等的。

返回A中特殊相等字符串组的数量。例如:

输入:[“a”,“b”,“c”,“a”,“c”,“c”]

输出:3

说明:3组[“a”,“a”],[“b”],[“c”,“c”,“c”]

输入:[“aa”,“bb”,“ab”,“ba”]

输出:4

说明:4组[“aa”],[“bb”],[“ab”],[“ba”]

输入:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]

输出:3

说明:3组[“abc”,“cba”],[“acb”,“bca”],[“bac”,“cab”]

输入:[“abcd”,“cdab”,“adcb”,“cbad”]

输出:1

说明:1组[“abcd”,“cdab”,“adcb”,“cbad”]

注意:

  • 1 <= A.length <= 1000

  • 1 <= A [i] .length <= 20

  • 所有A [i]具有相同的长度。

  • 所有A [i]仅包含小写字母。

02 理解题意

起初看这道题的题目描述看的是一脸懵逼,不知道它要表达的是什么意思,更不谈如何解题了。

只能硬着头皮看了,已经记不得看了多少遍了,结合它给的四个例子,终于是明白了它想要表达的意思,上面的中文描述是我在谷歌翻译的基础上做了润色的,方便理解,不信邪的人可以直接看英文描述,可以看到你怀疑人生!

题目说两个字符串S和J可以任意交换字符,但是有个前提i%2 == j%2,也就是说S的奇数位只能和奇数位换,S的偶数位只能和偶数位换,J的交换同理,换完之后要是S和J相等,就是特殊相等。

现在又有个特殊相等字符串组的概念,就是由那些特殊相等字符串组成的小帮派,每个小帮派里面的字符串,都符合上面的转换规则.问A中有多少个这样的小帮派?

结合例四来讲,很快你就会明白题目究竟是个神马意思了。

第四个例子中,A = [“abcd”,“cdab”,“adcb”,“cbad”],最后输出是特殊相等字符串组的数量为1,我们来一起看看这个1是怎么算出来的。

先对"abcd"转换一把,'a'、'c'可以互换,'b'、'd'可以互换,题目既然说了是任意互换,也就是说不论先后顺序,那我们就统一按照从小到大的顺序来,转换完之后就变成"ac" + "bd"="acbd"。

按照这样的逻辑,对"cdab"、"adcb"、"cbad"进行转换后,都变成了"acbd",所以最后只存在1个帮派了,就是"acbd"。

03 第一种解法

在处理每个单独的字符串时,利用一个26位长度的int数组,记录每个字符出现的次数,对奇数位、偶数维分开处理,然后将两数组转成一个新的字符串拼接在一起,存入HashSet中,最后特殊相等字符串组的数量就是HashSet的size了。

public int numSpecialEquivGroups(String[] A) {
Set<String> set = new HashSet<String>();
for (String str : A) {
int[] odd = new int[26];
int[] even = new int[26];
for (int i=0; i<str.length(); i++) {
if (i%2 == 0) {
even[str.charAt(i)-'a']++;
} else {
odd[str.charAt(i)-'a']++;
}
}
String newStr = Arrays.toString(odd)+Arrays.toString(even);
set.add(newStr);
}
return set.size();
}

04 第二种解法

我们可以对上面的解法再优化下,只用一个int数组,但是长度变为52,前半部分存偶数位,后半部分村奇数位,最后再转成字符串,存入HashSet中,最后特殊相等字符串组的数量就是HashSet的size了。

public int numSpecialEquivGroups2(String[] A) {
Set<String> set = new HashSet<String>();
for (String str : A) {
int[] count = new int[52];
for (int i=0; i<str.length(); i++) {
count[str.charAt(i)-'a'+26*(i%2)]++;
}
set.add(Arrays.toString(count));
}
return set.size();
}

05 小结

算法专题目前已连续日更超过六个月,算法题文章212+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode.893-特殊相等字符串组(Groups of Special-Equivalent Strings)的更多相关文章

  1. 【LeetCode】839. 相似字符串组 Similar String Groups (Python)

    作者: 负雪明烛 id: fuxuemingzhu 公众号:每日算法题 本文关键词:LeetCode,力扣,算法,算法题,字符串,并查集,刷题群 目录 题目描述 解题思路 并查集 代码 刷题心得 欢迎 ...

  2. [Swift]LeetCode893. 特殊等价字符串组 | 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 ...

  3. [Swift]LeetCode839. 相似字符串组 | Similar String Groups

    Two strings X and Y are similar if we can swap two letters (in different positions) of X, so that it ...

  4. Leetcode(8)字符串转换整数

    Leetcode(8)字符串转换整数 [题目表述]: 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我 ...

  5. 【js】Leetcode每日一题-子数组异或查询

    [js]Leetcode每日一题-子数组异或查询 [题目描述] 有一个正整数数组 arr,现给你一个对应的查询数组 queries,其中 queries[i] = [Li, Ri]. 对于每个查询 i ...

  6. Equivalent Strings (字符串相等?)

    Equivalent Strings   E - 暴力求解.DFS Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I ...

  7. [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 ...

  8. LeetCode 893. Groups of Special-Equivalent Strings (特殊等价字符串组)

    题目标签:String 题目可以让在 偶数位置的 chars 互换, 也可以让 在 奇数位置的 chars 互换. 所以为了 return 正确的 group 数量,需要把 那些重复的 给排除掉. 可 ...

  9. [LeetCode] 839. Similar String Groups 相似字符串组

    Two strings X and Y are similar if we can swap two letters (in different positions) of X, so that it ...

随机推荐

  1. otl_stream流相关绑定变量

    声明绑定变量 本章节将详细的说明如何在otl_stream流里面声明绑定变量. SQL语句.SQL语句块或存储过程在程序里面使用的时候总是带有占位符.OTL里面带有一个小的解析器用来解析这些占位符,并 ...

  2. Java: 创建自带依赖库的Jar包

    pom.xml文件如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&quo ...

  3. 转: Android 软件开发之如何使用Eclipse Debug调试程序详解(七)

    转自: http://www.uml.org.cn/mobiledev/201110092.asp Android 软件开发之如何使用Eclipse Debug调试程序详解(七)   发布于2011- ...

  4. POJ 1988 Cube Stacking(并查集+路径压缩)

    题目链接:id=1988">POJ 1988 Cube Stacking 并查集的题目 [题目大意] 有n个元素,開始每一个元素自己 一栈.有两种操作,将含有元素x的栈放在含有y的栈的 ...

  5. Dropbox电面面经

    他家电面有2轮,等待onsite.. . 电面1: 国人MM面的.这点感觉非常难得. 统计近期5分钟的点击量,实现hit和getHit两个函数.这题是他家高频题,我用deque实现的,hit的均摊时间 ...

  6. EXTJS 4 树形表格组件使用演示样例

    EXTJS 4 树形表格组件使用演示样例 一.总体效果图 version=1&modificationDate=1412058826000&api=v2" alt=" ...

  7. Android开发系列(二十七):使用ProgressDialog创建进度对话框

    进度对话框在寻常的应用中非经常见,比方下载的时候,打开页面的时候.转移文件等等.有环形的.有长条形的. 基本就这两种 创建进度对话框的两种方式: 1.创建ProgressDialog实例,然后调用Pr ...

  8. 2016/2/24 1,dotctype有几种? 2,了解html的发展历史

    1,dotctype有几种?DOCTYPE是document type(文档类型)的简写,用来说明你用的XHTML或者HTML是什么版本. 其中的DTD(例如上例中的xhtml1-transition ...

  9. ul、li中的DIV垂直居中

    当li高度可动态改变时,li中的DIV始终保持垂直居中. 由于高度不固定,不能用margin或者padding解决. 最头疼的是vertical-align: middle;也莫名其妙的失效了. 最终 ...

  10. TPC-H is a Decision Support Benchmark

    TPC-H is a Decision Support Benchmark http://www.dba-oracle.com/t_tpc_benchmarks.htm