如何使用Python 3为字符串列表生成最短的唯一缩写?
实现字符串的最短唯一缩写
这个需求很常见,尤其是在命令行工具、自动补全或者需要精简标识的场景里。我来给你一个简单直接的Python 3实现方案,完全匹配你期望的结果:
核心思路
要生成每个字符串的最短唯一缩写,关键在于找到最小长度的前缀,使得这个前缀在所有字符串的同长度前缀中只出现一次。具体分两步:
- 统计所有可能的前缀出现次数:遍历每个字符串的所有前缀(从1个字符到整个字符串),记录每个前缀的出现频次。
- 为每个字符串筛选最短唯一前缀:从最短的前缀(长度1)开始检查,直到找到第一个出现次数为1的前缀,这个就是该字符串的最短唯一缩写。
Python 3 实现代码
def get_shortest_unique_prefixes(words): # 第一步:统计所有前缀的出现次数 prefix_counts = {} for word in words: # 遍历当前单词的所有可能前缀(长度从1到单词总长度) for prefix_length in range(1, len(word) + 1): current_prefix = word[:prefix_length] prefix_counts[current_prefix] = prefix_counts.get(current_prefix, 0) + 1 # 第二步:为每个单词找到最短的唯一前缀 unique_prefixes = [] for word in words: for prefix_length in range(1, len(word) + 1): current_prefix = word[:prefix_length] if prefix_counts[current_prefix] == 1: unique_prefixes.append(current_prefix) break # 找到最短前缀后停止继续检查更长的 return unique_prefixes # 测试你的输入列表 original_words = ["topology", "track", "translate", "trunk", "tunnel", "ucse", "udp", "usb", "user-group"] result = get_shortest_unique_prefixes(original_words) print(result) # 输出:['to', 'trac', 'tran', 'tru', 'tu', 'uc', 'ud', 'usb', 'use']
代码解释
- 前缀统计阶段:我们用字典
prefix_counts记录每个前缀的出现次数。比如输入列表中,"topology"的前缀"to"不会和其他单词的同长度前缀重复,所以它的计数为1;而"track"和"translate"的前缀"tr"会重复,所以需要继续检查更长的前缀,直到"trac"和"tran"分别成为唯一前缀。 - 前缀筛选阶段:对每个单词从最短前缀开始检查,一旦找到计数为1的前缀就立即停止,这样保证了我们得到的是最短的唯一前缀。
这个方案逻辑清晰,处理你给出的输入完全没问题,也能应对更复杂的场景(比如某个单词是另一个单词完整前缀的情况)。
内容的提问来源于stack exchange,提问作者Michael B. Ortiz
相关产品推荐
相关产品推荐

