原文:214. 最短回文串(leetcode 解题) - 每天一个JavaScript小知识@Js中文网 · 码农进阶题库

原文地址:https://www.javascriptc.com/interview-tips/zh_cn/leetcode/leetcode-javascript-solution-0214/

题目:

难度:Hard

相关话题:字符串

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

示例1:

输入:"aacecaaa"
输出: "aaacecaaa"

示例 2:

输入:"abcd"
输出: "dcbabcd"
/**
 * @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
 * @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
 * @param {string} s
 * @return {string}
 */
var shortestPalindrome = function(s) {
  let [isPar,wi]=isP(s)
  if(isPar)return s
  let res='',mid
  wi=s.indexOf(s[wi])
  let nxtID=s.lastIndexOf(s[wi])
  while(true){
    mid=Math.floor((nxtID+wi) / 2)
    if((nxtID+wi) % 2===1){
      if(check(mid,mid+1,''))return res
    }else{
      if(check(mid-1,mid+1,s[mid]))return res
    }
    nxtID=s.lastIndexOf(s[wi],nxtID-1)
    if(nxtID===-1){
      let str=s.substring(wi),
          reverseS=str.split('').reverse().join('')
      return reverseS+shortestPalindrome(s.substring(0,wi))+str
    }
  }
  function isP(str){
    for(let i=0;i<str.length/2;i++){
      if(str[i]!==str[str.length-1-i])return [false,i]
    }
    return [true,null]
  }
  function check(l,r,str){
    while(r<s.length){
      let left,right=s[r]
      if(l<0)left=right
      else left=s[l]
      if(left!==right)return false
      str=left+str+right
      l--;
      r++
    }
    res=str
    return true
  }
};