学习记录:js算法(三):字母异位词分组

字母异位词分组

给你一个字符串数组,请你将 字母异位词 组合在一起。
可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

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

示例 2:
输入: strs = [""]
输出: [[""]]

示例 3:
输入: strs = ["a"]
输出: [["a"]]

我的思路:
之前在学习记录(一)的时候,写过字母异位词的算法,当时是通过sort排序,然后set去重进行比较的,这里可能需要一些改动,因为是数组吗,所以遇事不决就循环。
网上思路:
利用map()对象

1. 我的思路

  1. 先定义一个空数组 result· ,循环数组,获取每个字符串元素,再将字符串元素分割在一个数组中(利用 Array,.from() 或者 str.split() 都可以),然后将其排序后转为字符串 sortedStrArray.sort() 排序,Array.toString() 或者 Array.join(“”) 转为字符串)
  2. 定义一个 foundGroup 用来查找是否已经存在这个排序后的字符串的组
  3. 循环数组 result ,如果 result 中的任意一个组的第一个字符串排序后与当前字符串排序后相同,将它放到这个组内,将 foundGroup 修改后,跳出循环
  4. 如果在循环内没找到,就创建一个新的组
 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对象

  1. 类似于我想法的第一步
  2. 三元表达式给 list 赋值,注意:由于 map.get(key) 一开始就不存在,所以 list 的类型永远是数组
  3. 将循环的字符添加到 list 中,然后,map.set(key,list) 存储,由于 map()key 只能是唯一值,所以每次 set 相同的 key ,新值都会替代旧值,所以字母异位词都会在同一个数组中。
  4. 通过 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对象的使用很频繁,需要抓紧学习一波了。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值