LeetCode 214 shortest-palindrome

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值