题目:
- 字母异位词分组
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],
输出:
[
[“ate”,“eat”,“tea”],
[“nat”,“tan”],
[“bat”]
]
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。
解法:
/**
* @param {string[]} strs
* @return {string[][]}
*/
// 204ms 47.6mb
// Solution One(1) -- 排序数组分类
var groupAnagrams0 = function(strs) {
let len = strs.length
if(len === 0) return []
else if(len === 1) return [strs]
// 转序
let arr = []
for(let i = 0; i < len; i++){
arr.push(getSortStr(strs[i]))
}
// 获取位置
let sMap = new Map()
for(let i = 0; i < len; i++){
sMap.set(arr[i], sMap.get(arr[i]) ? sMap.get(arr[i]) + ',' + i : i.toString())
}
// console.log(sMap)
// 取出结果
let res = [], subArr
for(let values of sMap.values()){
// console.log(values)
let vArr = values.split(",")
subArr = []
for(let i = 0, len_v = vArr.length; i < len_v; i++){
subArr.push(strs[vArr[i]])
}
res.push(subArr)
}
return res
};
// Solution One(2) -- 排序数组分类 -- 优化版
// 196ms 45.7mb
var groupAnagrams2 = function(strs) {
let len = strs.length
if(len === 0) return []
else if(len === 1) return [strs]
// 转序
let eachSortStr = "", sMap = new Map()
for(let i = 0; i < len; i++){
eachSortStr = getSortStr(strs[i])
sMap.set(eachSortStr, sMap.get(eachSortStr) ? [... sMap.get(eachSortStr), strs[i]]: [strs[i]])
}
// 取出结果
return [... sMap.values()]
};
var getSortStr = function(str){
return str.split('').sort((a,b) => {return a.localeCompare(b)}).join('')
}
/*
方法二:按计数分类
思路
当且仅当它们的字符计数(每个字符的出现次数)相同时,两个字符串是字母异位词。
算法
我们可以将每个字符串 s 转换为字符数 count,由26个非负整数组成,表示 a,b,c 的数量等。我们使用这些计数作为哈希映射的基础。
复杂度分析
时间复杂度:O(NK),其中 N 是 strs 的长度,而 K 是 strs 中字符串的最大长度。计算每个字符串的字符串大小是线性的,我们统计每个字符串。
空间复杂度:O(NK),排序存储在 ans 中的全部信息内容。
*/
// 272ms
var groupAnagrams = function(strs) {
let len = strs.length
if(len === 0) return []
else if(len === 1) return [strs]
// 替换数字
let eachNumberStr = "", sMap = new Map(),
codeArr = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
for(let i = 0; i < len; i++){
eachNumberStr = getNumberArr(strs[i], codeArr)
sMap.set(eachNumberStr, sMap.get(eachNumberStr) ? [... sMap.get(eachNumberStr), strs[i]]: [strs[i]])
}
// 取出结果
return [... sMap.values()]
};
var getNumberArr = function(str, codeArr){
let arr = new Array(26), eachNum, eachNumberStr = ""
for(let i = 0, len = str.length; i < len; i++){
eachNum = codeArr.indexOf(str[i])
arr[eachNum] = arr[eachNum] ? arr[eachNum] + 1 : 1
}
for(let i = 0; i < 26; i++){
eachNumberStr += `#${arr[i] ? arr[i] : 0}`
}
return eachNumberStr
}