前置:最小表示法,Lyndon分解,Duval算法。
假设s的Lyndon分解为:s=s(1)+s(2)+……+s(k),那么最小表示法的首字符肯定是某一个Lyndon串的首字符,因为Lyndon串严格小于其非空真后缀。
最小表示法肯定要把最小的分解串挪到最前面,假如有多个分解串与s(k)相同,如下面这种情况:
s(1)≥s(2)≥……>s(p)=s(p+1)=……=s(k)
明显应该选择s(p)在最前。假如s(p)的首字符序号为i,那么这个i值其实就是Duval算法中外循环最后一次循环开始前的i值。
def LEM(s):
if not s:
return s
n,i=len(s),0
while i<n:
p,j,k=i,i,i+1
while k<n:
if s[j]<s[k]:
j=i
k+=1
elif s[k]==s[j]:
j+=1
k+=1
else:
break
while i<=j:
i+=k-j
return s[p:]+s[:p]
17

被折叠的 条评论
为什么被折叠?



