找到没有后缀树的字典编码最小字符串旋转和O(n)

时间:2013-08-10 21:55:10

标签: string algorithm complexity-theory circular-buffer

如何在循环数组中查找索引,以便从该索引开始形成的字符串首先按字典顺序排列。

对于Ex:在圆形数组ABCDEABCCDE中 答案是6,因为从第6个位置的元素A开始的圆形字符串首先出现在由圆形数组的所有可能字符串组成的字典中。

2 个答案:

答案 0 :(得分:0)

理论A:如果在长度为N的序列中出现K个字母X,则至少出现两次X,使得它们之间的距离小于N / K.

找到最小字母并在排序列表中排列指向其所有出现位置的指针。称之为A.

对于给定的r,在A [i] + r处找到字母min,并过滤掉A [i] + r处的元素不等于min的所有指针。同时过滤掉所有指针A [j],使某些i的A [j] = A [i] + r。

您必须在最多N / K次运行上述语句,每次运行最多花费O(K)时间。因此,该算法的复杂度为O(N)。

更详细的算法: 假设Z是我们正在处理的循环列表。

def filter(A,Z,r):
    t = min( Z[A[i]+r] ) forall i
    remove A[i] if Z[A[i]+r]!=t forall i

    rmflag = [false if A[i]==A[j]+r else false for i in range(len(A)] //NOTE: This step can be done in O(len(A)) time since A is sorted
    remove A[i] if rmflag[i]

答案 1 :(得分:-1)

Step 1: find the min char, call it minChar
Step 2: build list L0 = {i: string[i] == minChar, but string[i-1] != minChar}
Step 3: if L0.size() == 1, return L0[0]
step 3:
        3.0 set k=0, let L = L0
        3.1 k++
        3.2 BUild L1 = {i+1, i in L}. Build L = {i: string[i] is smallest for any k in L1}
        3.3 If L.size() == 1, return L[0]-k. Otherwise goto 3.1 to repeat

这应该会给你一个O(n)预期的复杂性。