LeetCode 214
虽然求的是最短的palindrome,其实题目可以转换为求从首字母开始的最长palindrome,然后反向添加剩余字符串。
那么简单的实现就是:
def shortestPalindrome2(self, s: str) -> str:
#time out version
if self.isPalindrome(s, len(s) -1): return s
for right in range(len(s)-2, -1, -1):
if self.isPalindrome(s, right):
break
result = ''.join(s[len(s)-1: right: -1]) + s
return result
def isPalindrome(self, s: str, right: int)-> bool:
strn = s
left = 0
while left < right:
if strn[left] != strn[right]:
return False
left +=1
right -=1
return True
这个效率确实不高,需要O(n^2), 看到一个比较高效的版本,把string encode掉,然后之间比较encode的结果:
def shortestPalindrome(self, s: str) -> str:
base = 26
mod = 175391
hash1 = 0
hash2 = 0
pos = -1
power = 1
for i in range(len(s)):
hash1 = (hash1 * base + ord(s[i]) - ord('a')) % mod
hash2 = (hash2 + (ord(s[i])-ord('a'))*power) % mod
if (hash1 == hash2):
pos = i
power = power*base%mod
return ''.join(s[len(s)-1: pos: -1]) + s