携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 17 天,点击查看活动详情
变位词组
原题地址
编写一种方法,对字符串数组进行排序,将所有变位词组合在一起。变位词是指字母相同,但排列不同的字符串。
注意:本题相对原题稍作修改
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:
- 所有输入均为小写字母。
- 不考虑答案输出的顺序。
思路分析
方法一
- 先定义一个
res来存储strs中每个字符串按照字典顺序排列后的字符串结果; - 定义
map以字符串排序后的结果为key,原始字符串组成的数组为value来存储分类后的字符串; - 遍历
res数组,若存在key,则把strs中对应下标的字符串存入res[key]中,否则res[key] = [strs[i]]; - 然后返回
Object.values(map)即可。
方法二
- 定义
res来存储最终结果,定义tmp来存储每一组异位词,定义count来存储已经是异位词的下标;定义isWords方法来判断两个字符串是否为异位词; - 双层遍历
strs,若count中包含下标,则跳过这次循环; - 将
i放入count,将strs[i]放入tmp,然后二次遍历strs,拖strs[i]和strs[j]是异位词,则将strs[j]存入tmp,将j存入count。在外层循环将tmp存入res中; - 最后返回
res即可。但是在测试用例倒数第二个中出现了超时,单独执行此方法需要20s。
AC 代码
方法一
/**
* @param {string[]} strs
* @return {string[][]}
*/
var groupAnagrams = function(strs) {
const res = []
const map = {}
strs.map(item => res.push(help(item)))
for(let i = 0; i < res.length; i++) {
if(map[res[i]]) {
map[res[i]].push(strs[i])
} else {
map[res[i]] = [strs[i]]
}
}
return Object.values(map)
};
var help = function(str) {
return str.split('').sort().join('')
}
结果:
- 执行结果: 通过
- 执行用时:144 ms, 在所有 JavaScript 提交中击败了13.33%的用户
- 内存消耗:51.5 MB, 在所有 JavaScript 提交中击败了41.33%的用户
- 通过测试用例:101 / 101
方法二
/**
* @param {string[]} strs
* @return {string[][]}
*/
var groupAnagrams = function(strs) {
const res = []
let tmp = []
let count= []
for(let i = 0; i < strs.length; i++) {
if(count.includes(i)) continue
count.push(i)
tmp = [strs[i]]
for(let j = i + 1; j < strs.length; j++) {
if(count.includes(j)) continue
if(isWords(strs[i], strs[j])) {
count.push(j)
tmp.push(strs[j])
}
}
res.push(tmp)
}
return res
};
var isWords = function(s, t) {
if(s.length !== t.length) return false
return s.split('').sort().join('') === t.split('').sort().join('')
}
结果:
- 执行结果: 超出时间限制