Lyndon分解求最小表示法(Python)

前置:最小表示法,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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值