LeetCode Q17:重复数字输入时字母组合代码输出[]问题排查
LeetCode第17题《电话号码的字母组合》代码问题排查
你遇到的问题是输入重复数字(比如'22'、'99')时输出空数组,核心原因出在字典的键唯一性上,具体分析和修复如下:
问题根源
你的代码里用了dec_dict来存储每个数字对应的字母列表,但字典的键是不能重复的。当输入是'22'时,遍历digits的两个'2',第二次赋值会覆盖第一次的,最终dec_dict里只有一个键'2',对应的to_do_value列表长度为1。后续循环中to_do_value[1:]是空列表,内层的for j in to_do_value[1:]根本不会执行,自然不会往result里加任何元素,输出就是空数组。
修复方案
直接跳过字典存储这一步,把每个数字对应的字母列表按顺序存入一个普通列表即可,不需要去重。另外原有的嵌套循环只适用于固定长度的输入(比如2个不同数字),可以优化成通用的组合逻辑,或者用itertools.product来简化。
修复后的代码(基于原逻辑修改)
from typing import List def letterCombinations(digits: str) -> List[str]: result = [] check_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']} if len(digits) == 0: return [] elif len(digits) == 1: return check_dict.get(digits) else: # 直接按顺序收集每个数字对应的字母列表,保留重复项 to_do_value = [check_dict[digit] for digit in digits] # 初始化结果为第一个数字的字母 result = to_do_value[0].copy() # 遍历后续每个字母列表,逐个组合 for chars in to_do_value[1:]: temp = [] for s in result: for c in chars: temp.append(s + c) result = temp return result
更简洁的写法(用itertools.product)
from typing import List import itertools def letterCombinations(digits: str) -> List[str]: if not digits: return [] check_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']} chars_list = [check_dict[digit] for digit in digits] # product会生成所有笛卡尔积,再拼接成字符串 return [''.join(comb) for comb in itertools.product(*chars_list)]
内容的提问来源于stack exchange,提问作者yic_l
相关产品推荐
相关产品推荐

