一大串字符串中最长的子字符串

时间:2012-07-11 03:13:03

标签: c

我有一个庞大的固定文本字符串库,以及一个频繁更改的输入字符串。我需要在最短的时间内从字符串s的开头找到库中任何字符串的最长匹配子字符串。在一个完美的世界里,我也会从图书馆返回下一个最长的比赛,然后是最好的比赛,依此类推。这不是最常见的常见字符串问题 - 我不是在寻找库中所有字符串的最长公共字符串...我只需要在s和巨大库中的每个字符串之间尽可能快地成对最佳子字符串。

2 个答案:

答案 0 :(得分:1)

重新阅读之后,我认为最好的方法是建立一个大型字符串库的trie或前缀树,然后匹配s

这有几个优点。首先,它以(至少在某种程度上)压缩形式存储您的大型库。其次,它或多或少会自动告诉您匹配给定输入的所有字符串,而不仅仅是最长的字符串。

它也非常适合您的用例 - 虽然从输入构建trie或(特别是)前缀树需要相当多的工作,之后使用它非常快。

答案 1 :(得分:0)

提前对列表进行排序(即编译时或之前),然后使用bsearch

http://www.cplusplus.com/reference/clibrary/cstdlib/bsearch/

一旦找到你的比赛,你就可以在附近看到前方和后方,以获得任意数量的“比赛”。

BTW,bsearch不一定是最快的,因为它通过比较器函数,但是在标准C库中。