LeetCode 126 Word Ladder II Python代码无输出问题排查
核心错误:循环提前终止
代码的队列操作存在致命问题:初始化时q.put(startWord)存入单个字符串,但进入循环后连续执行两次q.get()——第一次取出startWord,第二次尝试从已空的队列取元素,直接导致队列被清空。下一次循环判断q.empty() is False不成立,循环直接结束,后续所有单词变换、路径查找的逻辑根本没机会执行,自然没有任何输出。
字符串不可变导致修改失败
Python的字符串是不可变类型,代码中word[i] = j这行代码会直接抛出TypeError(如果循环走到这一步),程序会终止,无法继续执行。正确的修改方式是先转成列表:
word_list = list(word) word_list[i] = j new_word = ''.join(word_list)
队列存储对象混乱,路径引用失效
队列初始化存的是单个字符串startWord,但后续却把整个路径列表vec存入队列,类型完全不一致。而且vec是全局列表,存入队列的是它的引用,后续对vec的append/pop操作会直接改变队列中已有的路径内容,导致所有路径记录彻底混乱,无法保存有效路径。
路径保存未用副本,结果被篡改
当找到targetWord时,ans.append(vec)存入的是vec的引用,而非路径副本。后续vec的修改会直接改变ans中已存入的路径,最终结果全是错误的。应该存入副本:
ans.append(vec.copy())
usedlevel逻辑错误,误删候选单词
usedlevel记录了所有加入队列的单词,当level增加时,遍历usedlevel删除set1中的元素,会导致同一层未处理的单词被提前删除,或后续层的有效单词被误删,直接切断可能的路径,导致无法找到答案。正确逻辑是每一层单独记录该层使用的单词,处理完该层所有节点后再从set1中移除。
全局vec导致路径回溯失败
vec作为全局路径列表,在遍历字符变换时,append新单词后存入队列再pop,但队列里存的是vec的引用,pop操作会直接让队列中的路径失去这个新单词,等于根本没保存这条分支。正确做法是为每个新路径创建独立副本:
new_path = vec.copy() new_path.append(new_word) q.put(new_path)
内容的提问来源于stack exchange,提问作者mahadev kesarkar

