题目:

解题思路:
两种解法:
(1)对每个字符串进行字母排序,显然这并不是最优解需要进行排序,时间复杂度为nlogn

(2)较优解法:
1.检查是否为空数组
2.建立一个长度为26的数组,起始值为0,有字符串组中有几个字符串就建立几个26长度的数组,如图所示每个字母对应初始值都为0,用来记录,字母的出现频率。

3.遍历所有字符串.将字母的出现频率放到数组的对应位置里(利用ascii码)

4.遍历数组,按照相同字母出现频率进行分组归类(使用hashMap),key中

5.遍历map,将结果返回
代码:
方法一:
/**
* @param {string[]} strs
* @return {string[][]}
*/
var groupAnagrams = function(strs) {
if(strs.length==0)
{
return [];
}
const map=new Map();
for(const str of strs)
{
let a=str.split("");
a.sort(function(a,b){
//通过ascii值对字母进行排序
return a.charCodeAt()-b.charCodeAt()
});
const key=a.join("");
if(map.has(key))
{
map.set(key,[...map.get(key),str]);
}
else
{
map.set(key,[str])
}
}
const result=[];
for(const arr of map)
{
result.push(arr[1]);
}
return result;
};
方法二:
/**
* @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++)
{
const ascii=str.charCodeAt(i)-97;
//当输入数据为["bdddddddddd","bbbbbbbbbbc"]这时由于刚好为d和b10个则会使key值刚好相等,
//只需要对超出10个的数据进行处理
if(characters[ascii]<10)
{
characters[ascii]++;
}
if(characters[ascii]>=10)
{
characters[i]=characters[i]+"a";
}
}
const key=characters.join("");
if(map.has(key))
{
map.set(key,[...map.get(key),str]);
}
else
{
map.set(key,[str]);
}
}
const result=[];
for(const arr of map)
{
result.push(arr[1]);
}
return result;
};
本文介绍了一种用于将一组字符串按字母出现频率分组的高效算法。该算法首先检查输入是否为空,然后通过建立26个长度的数组来记录每个字符串中字母的出现次数,并使用HashMap对具有相同字母频率的字符串进行分组。
210

被折叠的 条评论
为什么被折叠?



