擅长:python、mysql、java
<p>如果两个字符串都不包含某个字符,比如<code>\0</code>-您可以编写</p>
<pre><code>"$first\0$second" =~ m/^(.*).*\0\1/s;
</code></pre>
<p>最长的公共前缀将保存为<code>$1</code>。</p>
<hr/>
<p><strong>编辑后添加:</strong>这显然效率很低。我认为,如果效率是一个问题,那么这根本不是我们应该使用的方法;但我们至少可以通过将<code>.*</code>更改为<code>[^\0]*</code>来改进它,以防止无用的贪婪,而这种贪婪将不得不再次被回溯,并将第二个<code>[^\0]*</code>包装在<code>(?>…)</code>中,以防止无法帮助的回溯。这:</p>
<pre><code>"$first\0$second" =~ m/^([^\0]*)(?>[^\0]*)\0\1/s;
</code></pre>
<p>这将产生相同的结果,但效率更高。(但仍然不如直接的基于非正则表达式的方法有效。如果两个字符串都有长度<em>n</em>,我预计最坏的情况至少需要O(<em>n</em><sup>2</sup>)时间,而直接的基于非正则表达式的方法在<em>its</em>最坏的情况下需要O(<em>n</em>)时间。)</p>