Word Permutation Generator:修改程序实现无重复单词全组合展示
搞定单词全组合去重的问题
我太懂这种找了一圈示例都不对味的感觉了——想生成一个单词字符串的所有可能组合,结果现有程序还一个劲输出重复内容,确实闹心。下面给你两种实用的解决思路,都是Python实现,你可以按需选:
思路一:简单粗暴型——用排列工具+集合去重
Python的itertools.permutations能直接生成所有排列,但碰到单词里有重复字符的时候就会出重复结果,这时候用集合自动去重就很方便:
from itertools import permutations def get_unique_word_combinations(word): unique_results = set() # 生成从1个字符到全长度的所有排列 for combo_length in range(1, len(word)+1): for char_group in permutations(word, combo_length): unique_results.add(''.join(char_group)) # 转成排序后的列表,看着更整齐 return sorted(unique_results) # 试试效果 print(get_unique_word_combinations("abc")) # 无重复字符的情况 print(get_unique_word_combinations("aab")) # 有重复字符的情况
这个方法好处是代码短,上手快;缺点是如果单词很长,生成大量重复排列再去重会有点费性能,适合短单词场景。
思路二:高效优化型——回溯法提前去重
要是你处理的单词比较长或者重复字符多,那用回溯算法在生成过程中就跳过重复分支会更高效:
def get_unique_combinations_backtrack(word): # 先把字符排序,让重复的挨在一起,方便后续判断 sorted_chars = sorted(word) results = [] # 用一个数组标记字符是否被用过 used = [False] * len(sorted_chars) def backtrack(current_combo, target_length): if len(current_combo) == target_length: results.append(''.join(current_combo)) return for i in range(len(sorted_chars)): if used[i]: continue # 关键:如果当前字符和前一个相同,且前一个没被用,说明是重复的分支,直接跳过 if i > 0 and sorted_chars[i] == sorted_chars[i-1] and not used[i-1]: continue used[i] = True current_combo.append(sorted_chars[i]) backtrack(current_combo, target_length) # 回溯,撤销选择 current_combo.pop() used[i] = False # 生成所有长度的组合 for length in range(1, len(sorted_chars)+1): backtrack([], length) return results # 测试一下 print(get_unique_combinations_backtrack("aab"))
这种方法从根源上避免了重复生成,性能会好很多,适合复杂场景。
小提醒
要是你要的是「组合」(比如ab和ba算同一个,不区分顺序),那把permutations换成combinations就行,同样可以用这两种方式去重。要是只需要固定长度的组合,调整一下循环的长度范围就ok。
内容的提问来源于stack exchange,提问作者Phyllis Dillion
相关产品推荐
相关产品推荐

