力扣:214. 最短回文串(Python3)
题目:
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。
来源:力扣(LeetCode)
链接:214. 最短回文串 - 力扣(LeetCode)
示例:
示例 1:
输入:s = "aacecaaa"
输出:"aaacecaaa"
示例 2:输入:s = "abcd"
输出:"dcbabcd"
解法:
设输入为s,在s前加的字符串为s',s的长度为n。
回文串是轴对称的,最长的输出情况是把输入s除了第0个元素,剩下的元素的逆序加到s前面,即s' = s[: 0 : -1],对应的对称轴是s[0];最短的输出情况是输入s本身就是回文串,即s'为空,对应的对称轴是s[n // 2](n为奇数)或s[(n - 1) // 2]和s[n // 2]之间(n为偶数)。
由此可以观察到,n为奇或偶有区别。
因为是求最短回文串,所以一开始的对称轴应该从中间,即上述“最短的输出情况”,开始考虑,然后不断向左移动,直到移到第0个元素,即上述“最长的输出情况”。所以原问题就转变为找对称轴。
对称轴不仅可能存在于某个元素上,而且可能存在于相邻元素之间,依次试探,找到对称轴即可结束。
n为偶时,先做1次第(n - 1) // 2个元素和第n // 2个元素之间的试探,后续试探和n为奇时相同。
代码:
class Solution:def shortestPalindrome(self, s: str) -> str:n = len(s)if not n % 2:if s[: n // 2] == s[: n // 2 - 1 : -1]:return sfor cur in range((n - 1) // 2, 0, -1):if s[: cur] == s[2 * cur : cur : -1]:return s[: 2 * cur : -1] + sif s[: cur] == s[2 * cur - 1 : cur - 1 : -1]:return s[: 2 * cur - 1 : -1] + sreturn s[: 0 : -1] + s
