C#如何从字符串列表中提取最小唯一前缀子序列
问题分析与修复方案
原代码错误点
- 拼写错误:C# 中
List<T>的元素数量是属性Count,不是方法count(),原代码会编译失败。 - 核心逻辑错误:内层循环仅判断了第一个不匹配的已存前缀就直接添加当前字符串,没有遍历所有已存前缀确认是否存在任意一个是当前字符串的前缀,导致大量不符合规则的长字符串被误加入结果。
修正后逻辑
你原有的排序逻辑是正确的:先将所有字符串按长度从小到大排序,保证短的候选前缀优先被处理。后续遍历每个字符串时,只要判断结果列表中不存在任何一个元素是当前字符串的前缀,才将当前字符串加入结果,否则直接跳过即可。
可运行代码
// values 是你的输入字符串集合 var result = new List<string>(); // 按字符串长度升序排序,保证短前缀优先进入结果集 var sortedStrings = values.OrderBy(x => x.Length).ToArray(); foreach (var s in sortedStrings) { // 标记当前字符串是否有匹配的前缀 bool hasPrefix = false; foreach (var existing in result) { if (s.StartsWith(existing)) { hasPrefix = true; break; } } // 没有匹配到任何前缀才加入结果 if (!hasPrefix) { result.Add(s); } }
测试验证
用你给出的两个示例测试:
- 输入
["1","11","111","12","13"]:排序后第一个元素是"1"加入结果,后续所有字符串都以"1"为前缀,全部跳过,最终输出["1"],符合预期。 - 输入
["11","12","13","131","141","14","111"]:排序后先处理"11"、"12"、"13"、"14"加入结果,后续的"131"以"13"为前缀、"141"以"14"为前缀、"111"以"11"为前缀,全部跳过,最终输出["11","12","13","14"],符合预期。
内容的提问来源于stack exchange,提问作者gaurav prasad
相关产品推荐
相关产品推荐

