我有很长的5个字符串(字符串的数目可能会改变),这些字符串没有固定格式。我将提供一个数字,它将指示子字符串的长度。我想找到具有给定长度的匹配子串。例如,字符串是
1. abcabcabc
2. abcasdfklop
字符串长度:3
给定这些值,输出如下:
匹配1:
Matched string : "abc"
Matches in first string: 3
Matching positions: 0,3,6
Matches in second string: 1
Match positions: 0
匹配2:
Matched string : "bca"
Matches in first string: 2
Matching positions: 1,4
Matches in second string: 1
Match positions: 1
我在4个foreach语句中做到了但在我看来,这似乎是不够的,尤其是在输入量很大的情况下,是否有任何建议或短期的方法来提高C_的效率?不需要成为真正的代码。只有伪代码也能帮上忙。谢谢高级版。
最佳答案
你可以用后缀数组来实现。(后缀树也可以很好地工作,但是它们在实现中需要更多的空间、时间和关注。)
将两个字符串连接起来,用两个字符串中都没有的字符分隔它们。然后构建一个后缀数组。然后你可以宣读你的答案。
标准的后缀数组给你一个字典排序的指针数组的后缀,连同一个“最长的共同前缀长度”数组,告诉你两个词典连续后缀中最长的共同前缀是多长。
使用最长的公共前缀长度数组来获得所需的信息是相当简单的;查找最长的公共前缀长度数组的所有最大子数组,其中最长的公共前缀长度至少是查询长度,然后,对于在第一字符串和第二字符串中都具有匹配的每一个,报告适当的前缀,并报告它发生k + 1次,其中k是最大子阵列的长度。
另一种更容易编码的方法是散列所有适当长度的子字符串。使用任何滚动哈希函数都可以轻松完成此操作。将指针的动态数组存储到每个散列的字符串中;对所有字符串进行散列后,对出现的所有散列进行迭代并查找匹配项。您需要以某种方式处理误报;一种(概率)方法是使用几个散列函数,直到误报概率小到可以接受的程度另一种方法是直接比较字符串,这种方法只有在很少匹配的情况下才可以接受。