leecode17电话号码的字母组合

该代码实现了一个Solution类,包含letterCombinations方法,用于根据给定的数字字符串生成对应的字母组合。方法使用递归策略,将数字映射到对应的字母集合,然后通过组合生成所有可能的字母串。当输入为空或只有一位数字时,有特定的返回结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

class Solution:
    digits_dict = {
        '2': ['a', 'b', 'c'],
        '3': ['d', 'e', 'f'],
        '4': ['g', 'h', 'i'],
        '5': ['j', 'k', 'l'],
        '6': ['m', 'n', 'o'],
        '7': ['p', 'q', 'r', 's'],
        '8': ['t', 'u', 'v'],
        '9': ['w', 'x', 'y', 'z'],
    }

    def letterCombinations(self, digits: str) -> List[str]:
        if not digits:
            return []
        if len(digits) == 1:
            return self.digits_dict[digits]
        res1 = self.letterCombinations(digits[0])
        res2 = self.letterCombinations(digits[1:])
        return [a+b for a in res1 for b in res2]

### 实现字母异位词分组 为了实现在 JavaScript 中解决 LeetCode 上的字母异位词分组问题,可以采用哈希表的方法来高效处理这个问题。该算法的核心在于通过某种方式将具有相同字符组成的字符串映射到同一个键上。 #### 使用排序作为键的方式 一种直观的做法是对每个单词内部的字符进行排序,这样所有由相同字符构成的不同排列都会得到相同的有序形式。然后利用这个有序后的字符串作为哈希表中的键,原始字符串则被加入对应的值列表中。 ```javascript var groupAnagrams = function(strs) { const map = new Map(); for (const str of strs) { // 将当前字符串转成数组并排序后再变回字符串 const sortedStr = [...str].sort().join(''); if (!map.has(sortedStr)) { map.set(sortedStr, []); } map.get(sortedStr).push(str); } return Array.from(map.values()); }; ``` 这种方法的时间复杂度主要取决于两个方面:一是遍历输入字符串数组所需 O(n),二是对每一个字符串执行排序操作所需的平均时间开销大约为 O(k log k),其中 n 表示输入字符串的数量,k 则代表单个字符串的最大长度[^2]。 #### 基于计数器构建唯一标识符 另一种更高效的策略是创建一个固定大小(即英文字母数量)的频率向量或对象用于记录各个字符出现次数,并以此为基础构造唯一的签名串作为哈希表的关键字。这种方式避免了显式的排序过程,在某些情况下可能会带来性能上的优势。 ```javascript function getCharCountArray(string){ const charCounts = {}; string.split('').forEach(char => { if(!charCounts[char]) charCounts[char]=0; charCounts[char]++; }); return JSON.stringify(Object.entries(charCounts)); } var groupAnagrams = function(strs) { const anagramsMap = {}; strs.forEach((word)=>{ const key=getCharCountArray(word); if(anagramsMap[key]){ anagramsMap[key].push(word); }else{ anagramsMap[key]=[word]; } }); return Object.values(anagramsMap); } ``` 此方法同样依赖于一次完整的数据扫描以及针对每项元素的操作;然而由于不再涉及昂贵的比较交换运算,整体效率通常会有所提升。不过需要注意的是当涉及到非ASCII范围内的特殊字符时可能需要额外考虑如何适配Unicode标准下的多字节情况[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值