假设我们得到了字符串的集合。我想知道这些字符串中的任何一个是否是集合中任何其他字符串的子字符串。换句话说,我想要一种用于以下任务的算法:
输入:
输出:使得是和的子字符串,或者如果不存在这样的则为None
是否有一种有效的算法?
如果将“子字符串”替换为“前缀”,则存在一种有效的算法(对字符串进行排序,然后进行线性扫描以比较相邻的字符串;排序将确保子字符串相邻)。但是测试任何字符串是否为其他字符串的子字符串似乎更具挑战性。一个朴素的算法是遍历所有对,但这需要子字符串测试。有没有更有效的算法?
我猜我们可以称其为“所有对子字符串测试”或类似的名称。
我的最终目标是修剪集合,以便通过删除集合中其他子字符串的每个子字符串,使任何字符串都不是其他子字符串。
提示:后缀数组。
—
别名2014年
附带说明一下,如果在找到子字符串时将其删除,则不正确。它会更少。另外,由于较长的字符串不能出现在较短的字符串中,因此应按长度排序。再次,Θ (n 2)在这里是错误的。
—
亚历克西斯·威尔克
@AlexisWilke,是正确的:这是最坏情况下子字符串测试的数量(最坏情况是没有字符串是任何其他子字符串的子字符串)。按长度排序仅给您2的因数,这不会影响渐近线。
—
DW