Manacher算法

57 篇文章 0 订阅

网上找的算法解释都是分为三种情况的,但是呢,代码里面看着似乎没有对三种情况做区分。

我自己按照三种情况写的,但是呢,可以进化到似乎不做区分的情况。

下面注释掉的就是三种情况

if :

   if :

   else:

else:

class Solution:
    def longestPalindrome(self, s):
        # new_nums = '!#' + '#'.join(nums) + '#$'
        nums = list(s)
        new_nums = '!#' + '#'.join(nums) + '#$'
        print('new_nums is {}'.format(new_nums))
        mark = [0 for _ in range(len(new_nums))]
        mxRight = 0
        pos = 0
        mx = 0
        for i in range(1, len(new_nums)-1):
            if i < mxRight:
                # if mark[2*pos-i] < mxRight - i:
                mark[i] = min(mark[2 * pos - i], mxRight - i)
                    # while new_nums[i - mark[i]] == new_nums[i + mark[i]]:
                    #     mark[i] += 1
            # else:
            while new_nums[i - mark[i] - 1] == new_nums[i + mark[i] + 1]:
                mark[i] += 1
            print("i is {}, mark[i] is {}".format(new_nums[i], mark[i]))
            if mark[i] + i > mxRight:
                mxRight = mark[i] + 1
                pos = i
            if mx < mark[i]:
                mx = mark[i]
                res = new_nums[i-mark[i]:i+mark[i]+1]
        print(mark)
        return ''.join([ele for ele in res if ele != '#'])

s = Solution()
print(s.longestPalindrome('abba'))

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值