其他题目---Manacher算法

来源:互联网 发布:网络主播黑名单查询 编辑:程序博客网 时间:2024/06/18 18:54

【题目】

  给定一个字符串str,返回str中最长回文子串的长度。要求时间复杂度O(N)。

【进阶题目】

  给定一个字符串str,想通过添加字符的方式使得str整体都变成回文字符串,但要求只能在str的末尾添加字符,请返回在str后面添加的最短字符串。要求时间复杂度O(n)。

【代码实现】

#python3.5#原问题def manacherString(string):    res = [0 for i in range(len(string) * 2 + 1)]    index = 0    for i in range(len(res)):        if i & 1 == 0:            res[i] = "#"        else:            res[i] = string[index]            index += 1    return resdef maxLcpsLength(str1):    if str1 == None or len(str1) == 0:        return 0    mStr = manacherString(str1)    help = [0 for i in range(len(mStr))]    index = -1    right = -1    maxLen = 0    for i in range(len(mStr)):        if right > i:            help[i] = min(right - i, 2 * index - i)        else:            help[i] = 1        while i + help[i] < len(mStr) and i - help[i] > -1:            if mStr[i+help[i]] == mStr[i-help[i]]:                help[i] += 1            else:                break        if i + help[i] > right:            right = i + help[i]            index = i        maxLen = max(maxLen, help[i])    return maxLen - 1#进阶题目def shortestEnd(str1):    if str1 == None or len(str1) == 0:        return 0    mStr = manacherString(str1)    help = [0 for i in range(len(mStr))]    index = -1    right = -1    maxLen = 0    maxContainsEnd = 0    for i in range(len(mStr)):        if right > i:            help[i] = min(right-i, help[2*index-i])        else:            help[i] = 1        while i + help[i] < len(mStr) and i - help[i] > -1:            if mStr[i+help[i]] == mStr[i-help[i]]:                help[i] += 1            else:                break        if i + help[i] > right:            right = i + help[i]            index = i        if right == len(mStr):            maxContainsEnd = help[i]            break    res = []    for i in range(len(str1)-maxContainsEnd+1):        res.append(str1[i])    return ''.join(res[::-1])
原创粉丝点击