![]() |
1
28
大多数其他的答案都集中在常数因子优化上,但也有可能渐进地做得更好。看看你的算法:它是O(n^2)。这似乎是一个可以更快地解决的问题! 考虑 Knuth Morris Pratt . 它跟踪我们迄今为止匹配的最大子字符串数量。这意味着它知道s1中有多少是匹配的 在s2末尾 这就是我们要寻找的价值!只需修改算法以继续,而不是在早期匹配子字符串时返回,并让它返回匹配的金额而不是末尾的0。 这给了你一个O(N)算法。好极了!
OverlappedStringLength(“abcdef”,“defghl”)返回3 |
![]() |
2
3
您可以使用DFA。例如,字符串
在scala中,第一个实现(直接使用regex)可能如下所示:
例如:
|
![]() |
3
2
你觉得怎么样(请原谅C):
此实现在确定需要复制的内容之前不会进行任何字符串复制(部分或其他),这将有助于提高性能。 此外,匹配检查首先测试可能匹配的区域(2个单个字符)的极值,在正常的英语文本中,该极值应能很好地避免检查任何其他字符是否不匹配。 只有当它建立了它能建立的最长匹配,或者根本不可能匹配时,两个字符串才会连接起来。我在这里使用了简单的“+”,因为我认为算法的其余部分的优化已经消除了原始算法中的大部分低效。试一试,让我知道它是否适合你的目的。 |
![]() |
4
2
下面是Python中的一个解决方案。只要不需要一直在内存中构建子字符串,它就应该更快。这项工作是在连接两个字符串的_concat函数中完成的。concat函数是一个连接任意数量字符串的助手。
|
![]() |
5
1
也可以在MySQL中使用以下存储函数执行此操作:
我用你的测试数据试过了:
|
![]() |
6
1
我认为这会很快: 有两个字符串,string1和string2。通过string1向后(从右到左)查看string2的第一个字符。一旦你有了那个位置,确定是否有重叠。如果没有,你需要继续搜索。如果有,你需要确定是否有可能进行另一场比赛。 要做到这一点,只需探索两个字符串中较短的一个,以便重复出现重叠字符。ie:如果匹配在string1中的位置剩下一个短的string1,则从string1中的新起始点重复初始搜索。相反,如果字符串2的不匹配部分较短,则搜索它以查找重叠字符的重复部分。 根据需要重复。 工作完成! 这不需要太多的内存分配(所有搜索都在适当的位置完成,只需要分配结果字符串缓冲区),并且只需要(最多)传递一个重叠的字符串。 |
![]() |
7
1
我正努力使这本书读起来尽可能的愉快。
编辑:我发现这几乎和杰里JVL的解决方案相同。唯一的区别是,这将适用于“abcde”、“d”情况。 |
![]() |
8
0
为什么不做这样的事呢? 首先获取三列中的第一个字符或单词(表示重叠)。 然后,开始向StringBuffer添加第一个字符串,一次添加一个字符。 每次查看是否到达与第二个或第三个字符串重叠的部分。 如果是,则开始连接还包含第一个字符串中的内容的字符串。 完成后,如果没有重叠,则从第二个字符串开始,然后是第三个字符串。 所以在问题的第二个例子中,我将把d和g保存在两个变量中。 然后,当我添加第一个字符串时 abc来自第一个字符串,然后我看到d也在第二个字符串中,所以我切换到从第二个字符串添加 从字符串2添加def,然后我继续使用字符串3。 如果在数据库中执行此操作,为什么不使用存储过程来执行此操作? |
![]() |
9
0
如果您是在数据库之外执行此操作,请尝试Perl:
它和你的算法完全一样,如果Java或Perl更快,我只是好奇而已; |
![]() |
10
0
这个问题看起来像是最长公共子序列问题的一个变体,可以通过动态规划来解决。 http://www.algorithmist.com/index.php/Longest_Common_Subsequence |
![]() |
11
0
下面是一个perl-pseudo-oneliner: $= S1.S2; S/([\s]+)\1/\1/; PerlRegex的效率相当高,您可以查找它们使用的算法,但它们确实实现了某种类型的fsm等,因此会得到相当好的o(..)结果。 |
![]() |
12
0
这里是一个Java实现,它发现长度为n和m的两个字符串之间的最大重叠,例如O(min(n,m))操作O(n)。 我和@sepp2k:s有着相同的想法,现在删除了答案,并做了进一步的工作。似乎工作得很好。其思想是迭代第一个字符串,并在找到与第二个字符串开头匹配的内容后开始跟踪。发现如果假匹配和真匹配重叠,可能需要同时执行多个跟踪。最后你选择最长的赛道。 我还没有找出最坏的情况,比赛之间有最大的重叠,但我不希望它螺旋式失控,因为我认为你不能重叠任意多场比赛。通常一次只跟踪一到两个匹配项:一旦出现不匹配,候选项就会被删除。
一些测试:
|
![]() |
Dima Malko · 如何在指定符号前添加符号? 2 年前 |
![]() |
shekharsabale · 从列表元素捕获子字符串 2 年前 |
![]() |
Manny · 如何比较Perl中的字符串? 2 年前 |
![]() |
Manan Girdhar · 拆分字符串并仅在java中使用第二部分 2 年前 |
![]() |
AnxiousLuna · Python使用len()获取数组索引数 2 年前 |
![]() |
antonoyaro8 · 数据帧中每列上的Grepl 2 年前 |