题目简介:
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。
示例 1:
1 | 输入: "aacecaaa" |
示例 2:
1 | 输入: "abcd" |
思路:
第一次尝试用KMP方法做题,有点头疼。
我们记s
的逆转字符串为reverse_str
,其实题目可以转换为s
前缀和reverse_str
后缀的最长公共部分,如下图所示:
这时我们可以将模式串定义为s + # + reverse_str
(#用来分割),将这个字符串的最长公共前后缀找到即可。
寻找最长公共前后缀的方法就要用到KMP了,我们需要求出next
数组,具体方法如下:
- 定义一个
k
来表示之前的最长公共前后缀 - 若
pattern[i - 1] == pattern[k]
,则说明该字符也匹配到了,最长公共前后缀+1,next[i] = k + 1
。 - 若
pattern[i - 1] != pattern[k] && k == 0
,则说明没有匹配的前后缀,next[i] = 0
。 - 若
pattern[i - 1] != pattern[k] && k != 0
,则我们需要找字符串pattern[0 ... k]
中的公共前后缀的长度,即k = next[k]
。
找出模式串的最长公共前后缀后,返回reverse_str.substr(0, reverse_str.size() - max_common) + s
即可(即加上的字符串为逆转字符串的前缀)。
代码如下:
1 | class Solution { |