214. Shortest Palindrome

2021-12-06  本文已影响0人  jluemmmm

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

问题等价于找到字符串从起始位置的最长回文子串,然后剩余部分的反转就是添加的字符串。

KMP(这个真的理解不了)

/**
 * @param {string} s
 * @return {string}
 */
var shortestPalindrome = function(s) {
  const n = s.length;
  const arr = new Array(n).fill(-1);
  for (let i = 1; i < n; i++) {
    let j = arr[i - 1];
    while (j !== -1 && s[j + 1] !== s[i]) {
      j = arr[j]
    }
    if (s[j + 1] === s[i]) {
      arr[i] = j + 1;
    }
  }
  
  let best = -1;
  for (let i = n - 1; i >= 0; i--) {
    while (best !== -1 && s[best + 1] !== s[i]) {
      best = arr[best];
    }
    if (s[best + 1] === s[i]) {
      best++;
    }
  }
 
  
  let add = (best === n - 1 ? '' : s.substr(best + 1, n));
  add = add.split('').reverse().join('');
  return add + s;
};

判断回文串

/**
 * @param {string} s
 * @return {string}
 */
var shortestPalindrome = function(s) {
  if (!s) return s;
  const len = s.length;
  for (let i = len; i > 0; i--) {
    if(isPalindrome(s.substring(0, i))) {
      return s.substring(i).split('').reverse().join('') + s;
    }
  }
};


var isPalindrome = function (s) {
  const len = s.length;
  for (let i = 0; i < len / 2; i++) {
    if (s[i] !== s[len - i - 1]) {
      return false;
    }
  }
  return true;
}

上一篇下一篇

猜你喜欢

热点阅读