用于在一组短字符串中查找非常常见的子串的算法

时间:2011-10-13 17:10:35

标签: c# string algorithm

我有一个来自外部数据库的大约1500个字符串的列表,随着时间的推移,当一组业务用户管理它们时,它们会出现具有语义价值的重复子串。

我正在构建一个前端,并希望向用户显示这些子字符串的过滤下拉列表。

例如,如果我有输入字符串:

  • US foo
  • 美国酒吧(非活动)
  • 英国蝙蝠
  • 英国巴兹(非活动)
  • AU womp
  • AU rat

我想回来:

  • US
  • UK
  • AU
  • 无效

我的第一个想法是有一个阈值参数和一个分界符列表。对于上面我可能会说threshold = .3和delimiters是space,(和)。

然后使用分隔符做一个string.split并使用一个数据结构,就像一个计算重复项目的集合(?)......

我不是想让别人在这里为我做我的工作 - 对那些做过这件事的人采取的方法的建议会很棒。

3 个答案:

答案 0 :(得分:2)

一种简单的方式就像你说的那样。设置Dictionary<String, int>以包含您的数据。然后,这很简单:

for each word in string
   if word is in dictionary
      increment dictionary value
   else
      add to dictionary with value of 1

然后,只需根据阈值过滤该字典,或返回按计数排序的条目。您也可以选择使用您不想跟踪的常用单词的“忽略列表”。

此外,如果您想要不区分大小写,请构建如下字典:new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);

答案 1 :(得分:2)

这个问题是Linq方法的一个很好的选择:

var words = from s in listOfStrings
            from word in s.Split(new[] { ' ', '(', ')' }, StringSplitOptions.RemoveEmptyEntries)
            group word by word;
var dic = words.ToDictionary(g => g.Key, g => g.Count());

答案 2 :(得分:0)

var input = new List<string>();
input.Add("Foo"); // I'd go for splitting by delimiters as well
input.Add("Bar");
input.Add("Foo");
var results = input.Distinct(); // -> Foo, Bar

我不太确定你的门槛是多少。