JavaScript算法45- 字母异位词分组(leetCode:49middle)

49. 字母异位词分组

一、题目

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

示例

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

提示:

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

二、题解

思路:

  1. 将原始字符串转化为有序字符串(字符串->数组split() -> 排序sort()->字符串join())
  2. 遍历字符串数组,并将字符串存入map中 (key:有序字符串,val:包含原始字符串的数组)
js 复制代码
/**
 * @param {string[]} strs
 * @return {string[][]}
 */
var groupAnagrams = function(strs) {
    const strMap = new Map( );
    strs.forEach(val => {
        const newStr = val.split('').sort().join('');
        if(strMap.has(newStr)){
            strMap.set(newStr,[...strMap.get(newStr),val]);
        }else{
            strMap.set(newStr,[val]);
        }
    })
    const res = [];
    for (const [key,val] of strMap) {
        res.push(val);
    }
    return res;
};

优化

js 复制代码
    const res = [];
    for (const [key,val] of strMap) {
        res.push(val);
    }
    return res;

利用map的values()方法,可以简化为

js 复制代码
 return Array.from(strMap.values());

三、补充

数组和字符串的转换

字符串-->数组 ('apple' -> ['a', 'p', 'p', 'l', 'e'])

  • str.split('')
  • Array.from(str)

数组 --> 字符串

  • arr.join() 默认逗号分隔 ['a', 'p', 'p', 'l', 'e'] -> 'a,p,p,l,e'
  • arr.join('') ['a', 'p', 'p', 'l', 'e'] -> 'apple'
  • arr.toString()默认逗号分隔 ['a', 'p', 'p', 'l', 'e'] -> 'a,p,p,l,e'

Map的 values()方法

Map 实例的 values() 方法返回一个新的 map 迭代器对象,该对象包含此 map 中每个元素的值,按插入顺序排列。

js 复制代码
const myMap = new Map();
myMap.set("0", "foo");
myMap.set(1, "bar");
myMap.set({}, "baz");

const mapIter = myMap.values();
console.log(mapIter.next().value); // "foo"
console.log(mapIter.next().value); // "bar"
console.log(mapIter.next().value); // "baz"

console.log(Array.from(myMap.values())); // ["foo", "bar", "baz"]
相关推荐
徐子童1 小时前
优选算法---链表
数据结构·算法·链表·面试题
如意.7591 小时前
从零开始的指针(3)
算法
星语卿1 小时前
Vuetify:构建优雅Vue应用的Material Design组件库
前端·javascript·vue.js
cwplh1 小时前
MX模拟赛总结
算法·动态规划
wangbing11251 小时前
界面规范11-对话框
javascript·vue.js·elementui
浅川.252 小时前
xtuoj 随机数
算法
shan&cen2 小时前
Day02 集合 | 30. 串联所有单词的子串、146. LRU 缓存、811. 子域名访问计数
java·数据结构·算法·缓存
一枚前端小能手2 小时前
🔥 滚动监听写到手抽筋?IntersectionObserver让你躺平实现懒加载
前端·javascript
遂心_2 小时前
React中的onChange事件:从原理到实践的全方位解析
前端·javascript·react.js
GHOME2 小时前
原型链的原貌
前端·javascript·面试