leetcode214. 最短回文串

思路:等价于找s 的最长回文前缀,因为前缀是回文的话,只需要加上后面的不是回文的字符串放到前面就行
先将字符串进行反转,然后遍历看添加反转后的多少到前面能形成回文串
具体是从0开始截取到字符串长度减1的时候一定能截到
如果截取一个能形成回文串说明原字符串除了最后一个应该已经是回文串了
也就是反转后的应该等于反转前的
依次类推,从低向上递增,找最少答案

def shortestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        if s == "":
            return ""
        sub = s[::-1]
        for i in range(len(s)):
            if sub[i:] == s[:len(s)-i]:   #截取了sub[:i],所以如果能形成说明原字符串除了后面的[len(s)-i:]应该是回文才行
                return sub[:i] + s        #返回截取的加上原字符串的

找最长回文子序列
思路:
从后往前截取找最长回文子串

def shortestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        if s == "":
            return ""
        for i in range(len(s),0,-1):     #找最长回文子序列
            if s[:i] == s[:i][::-1]:     #如果是回文字串,那么反转后相等
                return s[i:][::-1] + s   #将不是回文的部分反转后加到序列前面

Rabin-Karp 字符串哈希算法

def shortestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        def endcode(sub):
            return ord(sub)-ord("a")+1
        base = 26
        count = 0
        mul = 1
        mod = 10**5 + 7
        pre,con = 0,0
        for i in range(len(s)):
            pre = (pre*base + endcode(s[i]))%mod   #顺序的前缀hash值
            con = (endcode(s[i])*mul + con)%mod    #逆序的前缀hash值
            mul = mul*base%mod
            if pre == con:                          #相等代表是回文,遍历寻找最长的回文前缀
                count = i+1
        if count == len(s):
            return s 
        else:
            return s[count:][::-1] + s
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值