Leetcode 214.最短回文串

Time: 20190906
Type: Hard

题目描述

给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。

示例 1:

输入: “aacecaaa”
输出: “aaacecaaa”
示例 2:

输入: “abcd”
输出: “dcbabcd”

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shortest-palindrome
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

本题恰好是在Leetcode-cn上的第100道题。

在一个字符串前面添加字符,最长是把整个字符串镜像添加使其变为回文串。

先从朴素的思路做起,我们先写个判断字符串是否为回文的函数,然后从右往左一点点往里面填,拼接到旧的字符串上,判断是不是回文串,如果是的话,直接返回即可。

但是这个算法会有一个样例超时。

class Solution:
    def shortestPalindrome(self, s: str) -> str:
        if len(s) < 2:
            return s
        def isPalindrome(s):
            n = len(s)
            for i in range(n // 2):
                if s[i] != s[n - i - 1]:
                    return False
            return True
        if isPalindrome(s):
            return s
        
        for i in range(len(s) - 1, -1, -1):
            new_s = s[i:][::-1] + s
            if isPalindrome(new_s):
                return new_s
            # print(new_s)
        
        return ""

需要求助于更优秀的算法。

换个思路,我们先从左往右找到字符串的最长的回文子串,剩余的部分添加一个逆序即可。

代码

class Solution:
    def shortestPalindrome(self, s: str) -> str:
        n = len(s)
        if n == 0:
            return ""
        rs = s[::-1]
        i = 0
        while True:
            if rs[i:] == s[:n-i]: # 找到原字符串最大的回文部分
                print(rs[i:])
                break
            i += 1
        return rs[:i] + s

END.

你可能感兴趣的:(LeetCode)