是否有一个regexp可以找到两个字符串的最长公共前缀?而且如果一个正则表达式无法解决这个问题,那么使用正则表达式(perl,ruby,python等)中最精美的代码或oneliner就是什么。
PS:我可以通过编程轻松地做到这一点,我只是想好奇,因为在我看来这可以通过正则表达式解决。
PPS:使用正则表达式的O(n)解决方案可获得额外奖励。来吧,它应该存在!
如果有些字符两个字符串都不包含,例如,\0
您可以这样写
"$first\0$second" =~ m/^(.*).*\0\1/s;
并且最长的公共前缀将另存为$1
。
编辑添加:
这显然是非常低效的。我认为,如果要关注效率,那么这根本不是我们应该使用的方法。但我们至少可以通过改变改进.*
,以[^\0]*
防止无用的贪念,将只需要再次回溯,和包装第二[^\0]*
在(?>…)
防止回溯那也没有办法。这个:
"$first\0$second" =~ m/^([^\0]*)(?>[^\0]*)\0\1/s;
这将产生相同的结果,但效率更高。(但仍然不是近 作为 有效作为一个简单的非正则表达式为基础的方法。如果字符串都有长度 ñ
,我预计其最坏的情况下至少需要O( ñ 2)时间,而直接的非regex-基础的方法将采取O( ñ 的)时间 的 最坏的情况。)
问题内容: 我正在寻找一个Python库,用于从 一组字符串中 找到最长的公共子 字符串 。有两种方法可以解决此问题: 使用后缀树 使用动态编程。 实施的方法并不重要。重要的是,它可以用于 一组字符串 (不仅是两个字符串)。 问题答案: 这些成对的函数将在任意字符串数组中找到最长的公共字符串: 毫无疑问,该算法可以得到改进,而且我对Python的接触也很少,因此也许它在语法上也可能更有效,但是它应
问题内容: 这是一些示例输入: 我想提取代表实际类型的字符串。所以我的输出是: 这是我到目前为止使用的正则表达式(因为它是Java语言,所以进行了两次转义): 它适用于,但不适用于其他两个。我认为最好的解决方案是基本上说“在最后一个冒号之后得到所有内容”,但我不确定如何做。请注意,它还必须包含这些内容。 问题答案: 您不需要正则表达式: 只需找到最后一个,然后把所有东西都拿走。然后修剪它以删除前导
我有一个包含数千行的文本文件。这里有一个例子 我试图提取'nt60'、'nt50'末尾的字符串。 问题是会包含行尾字符() 我想使用正则表达式搜索来匹配从 (') 开始的字符串,但我不知道我应该用什么来匹配 。 有人能帮忙吗?
我需要一个字符串来获取键->值对的数组(2-dim)。 一个“匹配”是当两个单词之间有一个->时,->前后有mo空格 例如输入字符串: skip_me key1->value1 key2->value2 skip_me2 key3->value3 skip_me3 skip_me->还 结果应为数组: key1,value1 key2,value2 key3,value3 这是我的代码: 我的正则
我正在学习最长公共子序列,使用以下算法: 公共级LCS{ 但是程序返回一个ErrorCharAt(未知来源),并且没有做任何事情。 另外,如果我将int i和j更改为0,那么下面的E将是索引-1和错误 我现在很迷路。有人能帮我吗?
我遇到了一个问题语句,要在给定的两个子字符串之间找到所有公共子字符串这样一种方式,在每种情况下都必须打印最长的子字符串。问题声明如下: 编写一个程序来查找两个给定字符串之间的公共子字符串。但不包括包含在较长公共子字符串中的子字符串。 null 在这种情况下,您不必使用字符串实用程序方法,如:contains、indexOf、StringTokenizer、split和replace。 我的算法是这