/**
* @param {string} s
* @return {string}
*/
var shortestPalindrome = function (s) {
let len = s.length,
str = s.split('').reverse().join('')
function kmp(query, pattern) {
let fail = Array(len).fill(-1);
for (let i = 1; i < len; ++i) {
let j = fail[i - 1];
while (j != -1 && pattern[j + 1] != pattern[i]) {
j = fail[j];
}
if (pattern[j + 1] == pattern[i]) {
fail[i] = j + 1;
}
}
let match = -1;
for (let i = 0; i < len; ++i) {
while (match != -1 && pattern[match + 1] != query[i]) {
match = fail[match];
}
if (pattern[match + 1] == query[i]) {
++match;
}
}
return match;
}
let num = kmp(str, s),
add = num == len - 1 ? '' : s.substring(num + 1);
return Array.from(add).reverse().join('') + s;
}