给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。
示例 1:
输入: “aacecaaa”
输出: “aaacecaaa”
示例 2:
输入: “abcd”
输出: “dcbabcd”
/**
* @param {string} s
* @return {string}
*/
var shortestPalindrome = function (s) {
const reverse = s.split('').reverse().join('');
const str = s + '#' + reverse; // 加#防止kmp将单个字母多次重复算进去
const next = new Array(str.length).fill(0); // 这个写法很有意思
// 抽出来,方便学习记忆,是固定的模板代码
const kmp = (next, str) => {
next[0] = 0;
let len = 0;
let i = 1;
while (i < str.length) {
if (str[i] == str[len]) {
len++;
next[i] = len;
i++;
} else {
if (len == 0) {
next[i] = 0;
i++;
} else {
len = next[len - 1];
}
}
}
};
kmp(next, str); // KMP找出pattern的公共前后缀
const maxLen = next[str.length - 1]; // 获取最长公共前后缀
const add = s.substring(maxLen).split('').reverse().join(''); // 去重,即去掉reverse的maxLength部分
return add + s;
};
let array = new Array(length).fill(0); // 这个写法可以保证占位
这个是抄B站大佬的解法。