擅长:python、mysql、java
<p>简单的二次时间解决方案如下:</p>
<pre><code>res = []
n = len(lst)
for i in xrange(n):
if not any(i != j and lst[i] in lst[j] for j in xrange(n)):
res.append(lst[i])
</code></pre>
<p>但我们可以做得更好:</p>
<p>让<code>$</code>是一个不出现在任何字符串中的字符,其值比所有实际字符的值都要低。在</p>
<p>让<code>S</code>是所有字符串的串联,中间是<code>$</code>。在您的示例中,<code>S = a$abc$b$d$xy$xyz</code>。在</p>
<p>您可以在线性时间内生成<code>S</code>的<a href="http://en.wikipedia.org/wiki/Suffix_array" rel="nofollow noreferrer">suffix array</a>。您还可以使用我描述的一个更简单的O(nlog^2n)构造算法<a href="https://stackoverflow.com/questions/21220150/rank-the-suffix-of-a-list">in another answer</a>。在</p>
<p>现在,对于<code>lst</code>中的每个字符串,检查它是否只在后缀数组中出现一次。可以进行两次二进制搜索来查找子字符串的位置,它们在后缀数组中形成一个连续的范围。如果字符串出现多次,则将其删除。在</p>
<p>通过预先计算LCP信息,这也可以在线性时间内完成。在</p>
<p>示例O(n log^2 n)实现,改编自<a href="https://stackoverflow.com/a/21342145/916657">my suffix array answer</a>:</p>
^{pr2}$
<p>然而,解释开销很可能导致这比O(n2)方法慢,除非<code>S</code>真的很大(大约10^5个字符或更多)。在</p>