【发布时间】:2017-02-27 16:52:55
【问题描述】:
我有相当多(1000 个)的字符串,比如 S_1...S_n,其中的字符只取 2 个值——比如为了便于可视化“”(空格)或“_”(下划线)。
S_1: _______ ____ __ _____ ___
S_2: _______ _____ ___
S_3: _____________
S_4: ____ _____________
posi- 01234567890123456789012345...
tion 0 1 2
我想找到最长的一段,其中 2 个(或更多)字符串共享相同的连续下划线长度。在上面的例子中,它是 S_3 和 S_4 之间从位置 7 到 15 共享的部分,包括 9 个位置。
是否有一种有效的算法可以让我找到执行此操作的一对(或更多)字符串?我不认为这是相当字符串匹配的事情,就像最长的公共子字符串问题一样,因为这些字符串具有特定的对齐方式。
请注意,对于它的价值,这只是一个更大的算法的一小部分,它重复执行此操作,将共享长度合并在一起形成一个新字符串,因此在下一次迭代中,我会
S_1: _______ ____ __ _____ ___
S_2: _______ _____ ___
S_3: ____
S_4: ____ ___
S_N+1: _________
然后我会重复算法以找到(在这种情况下)S_2 和新的 S_N+1 共享下一个最长的部分,从位置 11-15,形成
S_1: _______ ____ __ _____ ___
S_2: _______ ___
S_3: ____
S_4: ____ ___
S_N+1: ____
S_N+2: _____
然后 S_1、S_2 和 S_3 从位置 3-6 共享一个部分,给出
S_1: ___ ____ __ _____ ___
S_2: ___ ___
S_3:
S_4: ____ ___
S_N+1: ____
S_N+2: _____
S_N+3: ____
等等
【问题讨论】:
-
不是一个真正聪明或快速的解决方案,但它可能会有所帮助。将字符串转换为二进制数并使用
And(按位运算)en.wikipedia.org/wiki/Bitwise_operations_in_C 进行比较,然后遍历新创建的数组并找到最长的 1 或 0。 -
是的,直到我达到最大位长。不过,我认为有一些库允许任意长度的位数组。请注意,我很乐意通过存储间隔而不是字符串本身来做到这一点(实际上,字符串只是表示集合列表中存在或不存在某些数字。