网上找的算法解释都是分为三种情况的,但是呢,代码里面看着似乎没有对三种情况做区分。
我自己按照三种情况写的,但是呢,可以进化到似乎不做区分的情况。
下面注释掉的就是三种情况
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'))