49. 字母异位词分组
题目
Given an array of strings strs, group the anagrams together. You can return the answer in any order.
给个字符串数组,返回一个“字谜”集合,顺序无所谓。
An Anagram is a word or phrase formed by rearranging the letters of a different word or phrase, typically using all the original letters exactly once.
字谜的意思是 —— 包含一样的字母但顺序不一样的词,通常每个字母只出现一次
说白了是 字母的 可重复 组合
PS:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i] consists of lower-case English letters.
英文字典序
坑:
["dgggggggggg","ddddddddddg"]这两个字符串拥有一样的字母,但是数量不同,所以不能分为一组。
思路
1. 初始化,把原数组第一项push到目标数组里;
2. 从第二项开始循环原数组,得到i;
3. 初始化used变量,用于判断i是否被使用;
4. 然后循环目标数组,得到j;
5. 拿出两个字符串判断,如果每个字符都出现过,如果两个字符串是相同的组合,那么把i push 到目标数组的j里,并且把used设为true;组合的逻辑:
- 1. 长度一致
- 2. s1里所有字符要在S2里出现过
- 3. 出现过的次数要一致
6. 判断used,如果为false,在目标数组里初始化他
上面的思路有两个问题 ——
- 循环过多, 两个数组和两个字符串的对比,深度大概有4,时间复杂度在N^4以上;
- 判断两个字符串是否属于一种组合很麻烦 所以换成:
- 用一个map管理结果;
- 每次拿到字符串先用字典序确定组合;
- 最后逻辑判断是push还是init
- 转换成数组
代码
ts
|
|
go
|
|
仰望大佬
|
|
说实话一开始这么玩我没看懂,后来我才发现,他的组合判断是遍历字符串,然后每个字符对应一个质数,然后用乘积来表示一串字符串,并且因为质数不可约分的性质,保证了唯一性。 真是给大佬跪了。
然后我改成了ts版本,瞬间超过100%的用户😂
|
|