按字典顺序排列每个滑动窗口位置的第一个固定大小的子串

时间:2011-10-29 17:53:55

标签: string algorithm sorting substring sliding-window

从给定的字符串开始,我想找到在字符串中相同大小的所有子字符串中以lexiographical排序顺序排在第一位的子字符串(一些固定大小为k)。

我会在非常长的字符串(大小为m)上使用滑动窗口执行此操作,并且当我通过字符串移动时,我希望找到每个滑动窗口(大小为n> k)位置的子字符串。

似乎微不足道的解决方案需要m * O(n log(n))时间。

我想如果我在开始时进行正常排序然后只删除从最后一个窗口位置开始处开始的子字符串并插入在结尾处结束的新子字符串,我可以得到m * O(log(n))每当我移动窗口时,当前窗口位置到已排序的子串集合中。 (当然我不会存储子串,但只是保留它们在集合中的位置,所以空间要求只是n-k整数),

这有更快的算法吗?

1 个答案:

答案 0 :(得分:0)

设m为输入字符串的大小,n为您要查找的字符串的长度。我想你可以通过使用后缀树在时间O(m)中解决这个问题。

首先为输入字符串构建后缀树。这需要时间O(m)。现在,在树上进行深度优先搜索,始终在每一步选择按字典顺序排列的第一选择。在这样做的过程中,您找到的第一个长度为n的字符串是长度为n的按字典顺序排列的第一个子字符串。对于长度为m的字符串,在后缀树上执行DFS需要时间O(m),因此总体而言需要时间O(m)。