携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情
本人入行以来已有数月,奈何技术一直平平,和资深程序员讨教方法,他们推荐我去刷算法,算法是能够提高程序员的逻辑思维能力,借助平台的这次活动,记录一下自己在学习算法路程上的心得于体会
题目
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
这里可能大家有些不懂,细致观察一下就会发现,他会把每个单词中只要包含同样的字符且不要求是完全一样的单词放到一组数组中,这也就是题目想表单的意思
题解
这道题一共有两种解法
- 第一种解法是通过排序,比如第一个单词是
eat,我们把他的字母变成aet,第二个单词也给他变成aet,接下来寻找与aet相等的单词,进行添加到数组中,这种解法比较简单 - 第二种解法是去统计字符出现的频率,我们这里先检查一下当前数组是否为空数组,不是空数组的情况下,我们在建立一个长度为26的数组,起始值全为0,一共二十六个0,英语标记每一个字母出现的次数,遍历所有的字符串,将字母的出现频率放到数组的对应位置中,这里需要利用到
ascii码,在遍历数组,按照相同字母的出现频率进行分组归类,需要使用hashMap,最后遍历map将结果返回
/**
* @param {string[]} strs
* @return {string[][]}
*/
var groupAnagrams = function(strs) {
// 判断是否为空,数组为空返回空数组
if(strs.length==0){
return []
}
const map=new Map()
// 进行循环遍历当前单词数组
for(const str of strs){
// 创建空数组
const characters=Array(26).fill(0);
// 循环每个单词
for(let i=0;i<str.length;i++){
// 转换为ascii码,这里需要减去97,因为a-97就等于0 ,b减去97等于1以此类推
const ascii=str.charCodeAt(i)-97;
// 记录出现数量
characters[ascii]++;
}
// 这里是一个数组,我们将这个数组转换成字符串
const key =characters.join('');
//进行分类,查询当前是否包含这个key值
if(map.has(key)){
//包含进行添加
map.set(key,[...map.get(key),str])
}else{
//不包含进行新建
map.set(key,[str])
}
}
const result=[ ]
// 遍历map进行存储结果
for(const arr of map){
result.push(arr[1])
}
// 返回结果
return result;
};
坚持努力,无惧未来!