js + leetcode刷题:No.49 字母异位词分组

题目:

  1. 字母异位词分组
    给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

示例:

输入: [“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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值