剑指 Offer II 033 变位词组

这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

剑指 Offer II 033. 变位词组

给定一个字符串数组 strs ,将 变位词 组合在一起。 可以按任意顺序返回结果列表。

注意:若两个字符串中每个字符出现的次数都相同,则称它们互为变位词。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
lua复制代码示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]



提示:

1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i] 仅包含小写字母

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/sf…

思路

  • 这道题大家会不会想到之前的有效的变位词
    • 首先回忆有效的变位词这道题的思路
    • 判断abcdefggfedcba是异位词,我们只需要构建一个哈希表
    • 或者为了更简单,就创建一个26位的数组,最开始遍历第一个字符串,对应索引位置加一
    • 第二次遍历第二个字符串,对应索引位减一,如果最后数组都为零0️⃣,那么就代表这两个字符串真的是字母相同,而位置不同而已(异位词)
  • 回过头来看这道题,我们有两种方式去实现
    1. 第一种就是将字母进行排序,最后再定义一个哈希表
    2. 而第二种当时我们可以想到,如果将每个英文小写字母映射到对应一个质数的话
    • 那么每个字符串的字母对应质数最后的乘积,最后一定是相同的就一定为同一个字母
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
java复制代码class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
int code[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41,
43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101};

Map<Long,List<String>> team = new HashMap<>();
for (String str : strs) {
long wordHash = 1;
for (int i = 0; i < str.length(); i++) {
wordHash *= code[str.charAt(i) - 'a'];
}
team.putIfAbsent(wordHash,new LinkedList<String>());
team.get(wordHash).add(str);
}

return new LinkedList<>(team.values());
}
}

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%