LeetCode 214. Shortest Palindrome

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

v2-1c34a824e6c46ccc0ca94393824d7cda_1440w.jpg

Description



Given a string s, you are allowed to convert it to a palindrome by adding characters in front of it. Find and return the shortest palindrome you can find by performing this transformation.


Example 1:

Input: "aacecaaa"

Output: "aaacecaaa"


Example 2:

Input: "abcd"

Output: "dcbabcd"


描述



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


示例 1:

输入: "aacecaaa"

输出: "aaacecaaa"


示例 2:

输入: "abcd"

输出: "dcbabcd"


思路



  • 我们先找到给定的字符串中的最大回文字符串(字符串必须从左端开始),然后将字符串中剩余的字符串反转添加到原字符串头部即可.
  • 关于如何找到从起点开始的最长回文字符串,最直观的方式是从字符串最右边开始判断,直到找到回文字符串,这样做可行,但是会超时.
  • 我们使用KMP算法中初始化next数组的算法来解决此题目,有关KMP算法的详细解释,请参考这个视频.
  • 我们另s`=原字符串s的反转,我们将s和s`用一个特殊字符(如"$")连接起来,根据KMP的next定义,next[i]=j表示字符串从索引i位置,往前数(包括本身i),有j个字符与从字符串开头数起的j个字符一一对应相同.于是next的最后一个位置的值next[-1]就表示从最后一个位置往前数起有next[-1]字符与从字符串开头的next[-1]字符一一相等.也就求得了原字符串中回文字符串的个数.


# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2019-01-23 19:08:33
# @Last Modified by:   何睿
# @Last Modified time: 2019-01-25 22:38:27
class Solution:
    def shortestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        # KMP next 数组
        _next = [0] * (2 * len(s) + 1)
        # 重新拼接字符串
        news = s + "$" + "".join(list(reversed(s)))
        j = 0
        # 构造_next数组
        for i in range(1, len(news)):
            if news[i] == news[j]:
                _next[i] = j + 1
                j += 1
            else:
                while j != 0 and news[i] != news[j]:
                    j = _next[j - 1]
                if news[i] == news[j]:
                    _next[i] = j + 1
                    j += 1
        return news[len(s) + 1:len(s) + len(s) - _next[-1] + 1] + s


源代码文件在这里.



目录
相关文章
LeetCode 409. Longest Palindrome
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。 在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。
74 0
LeetCode 409. Longest Palindrome
|
索引
LeetCode 336. Palindrome Pairs
给定一组唯一的单词, 找出所有不同 的索引对(i, j),使得列表中的两个单词, words[i] + words[j] ,可拼接成回文串。
137 0
LeetCode 336. Palindrome Pairs
|
canal
LeetCode 125. Valid Palindrome
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
92 0
LeetCode 125. Valid Palindrome
LeetCode 234. 回文链表 Palindrome Linked List
LeetCode 234. 回文链表 Palindrome Linked List
Leetcode-Easy 234. Palindrome Linked List
Leetcode-Easy 234. Palindrome Linked List
58 0
Leetcode-Easy 234. Palindrome Linked List
【LeetCode】Palindrome Pairs(336)
  Given a list of unique words. Find all pairs of distinct indices (i, j) in the given list, so that the concatenation of the two words, i.e. words[i] + words[j] is a   palindrome.
111 0
LeetCode之Palindrome Number(回文数)
LeetCode之Palindrome Number(回文数)
71 0
|
Java Python
LeetCode 234:回文链表 Palindrome Linked List
​请判断一个链表是否为回文链表。 Given a singly linked list, determine if it is a palindrome. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题? Follow up:Could you do it in O(n) time and O(1) space? 解题思路: 首先是寻找链表中间节点,这个可以用快慢指针来解决,快指针速度为2,慢指针速度为1,快指针遍历完链表时,慢指针刚好走到中间节点(相对)。
690 0
|
Java
[LeetCode]Palindrome Number解析
链接:https://leetcode.com/problems/palindrome-number/#/description难度:Easy题目:9.Palindrome Number Determine whether an integer is a palindrome.
833 0
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行