字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。
可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
我的思路:
之前在学习记录(一)的时候,写过字母异位词的算法,当时是通过sort排序,然后set去重进行比较的,这里可能需要一些改动,因为是数组吗,所以遇事不决就循环。
网上思路:
利用map()对象
1. 我的思路
- 先定义一个空数组 result· ,循环数组,获取每个字符串元素,再将字符串元素分割在一个数组中(利用 Array,.from() 或者 str.split() 都可以),然后将其排序后转为字符串 sortedStr(Array.sort() 排序,Array.toString() 或者 Array.join(“”) 转为字符串)
- 定义一个 foundGroup 用来查找是否已经存在这个排序后的字符串的组
- 循环数组 result ,如果 result 中的任意一个组的第一个字符串排序后与当前字符串排序后相同,将它放到这个组内,将 foundGroup 修改后,跳出循环
- 如果在循环内没找到,就创建一个新的组
var groupAnagrams = function (strs) {
const result = [];
for (let str of strs) {
const sortedStr = str.split('').sort().join('');
let foundGroup = false;
for (let group of result) {
if (group[0].split('').sort().join('') === sortedStr) {
group.push(str);
foundGroup = true;
break;
}
}
if (!foundGroup) {
result.push([str]);
}
}
return result;
};
2. 利用Map对象
- 类似于我想法的第一步
- 三元表达式给 list 赋值,注意:由于 map.get(key) 一开始就不存在,所以 list 的类型永远是数组
- 将循环的字符添加到 list 中,然后,map.set(key,list) 存储,由于 map() 的 key 只能是唯一值,所以每次 set 相同的 key ,新值都会替代旧值,所以字母异位词都会在同一个数组中。
- 通过 map.values() 返回所有存储的值,然后使用 Array.from() 将其改成数(因为 map.values() 返回的是一个 MapIterator 对象,或者可以通过结构的方式:[…map.values()])
var groupAnagrams = function (strs) {
let map = new Map()
for (let i of strs) {
let arr = Array.from(i)
arr.sort()
let key = arr.join("")
let list = map.get(key) ? map.get(key) : new Array()
list.push(i)
map.set(key, list)
}
return Array.from(map.values())
};
总结
学习算法这三天,Map对象的使用很频繁,需要抓紧学习一波了。