Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 字符串中最长的回文_Javascript_Algorithm_Palindrome - Fatal编程技术网

Javascript 字符串中最长的回文

Javascript 字符串中最长的回文,javascript,algorithm,palindrome,Javascript,Algorithm,Palindrome,我编写了以下函数来查找字符串中最长的回文。它可以很好地工作,但对“中午”或“更红”这样的词不起作用。我拨弄了一下,将for循环中的第一行从: var oddPal = centeredPalindrome(i, i); 到 现在它起作用了,但我不清楚为什么。我的直觉是,如果你检查一个奇数长度的回文,它会在开头有一个额外的字符(我用白板把它涂掉了,这就是我得出的结论)。我的推理正确吗 var longestPalindrome = function(string) { var length

我编写了以下函数来查找字符串中最长的回文。它可以很好地工作,但对“中午”或“更红”这样的词不起作用。我拨弄了一下,将
for
循环中的第一行从:

var oddPal = centeredPalindrome(i, i);

现在它起作用了,但我不清楚为什么。我的直觉是,如果你检查一个奇数长度的回文,它会在开头有一个额外的字符(我用白板把它涂掉了,这就是我得出的结论)。我的推理正确吗

var longestPalindrome = function(string) {

  var length = string.length;
  var result = "";

  var centeredPalindrome = function(left, right) {
    while (left >= 0 && right < length && string[left] === string[right]) {
      //expand in each direction.
      left--;
      right++;
    }

    return string.slice(left + 1, right);
  }; 

  for (var i = 0; i < length - 1; i++) {
    var oddPal = centeredPalindrome(i, i); 
    var evenPal = centeredPalindrome(i, i);

    if (oddPal.length > result.length)
      result = oddPal;
    if (evenPal.length > result.length)
      result = evenPal;
  }

  return "the palindrome is: " + result + " and its length is: " + result.length;
};

如果你输出“奇数”回文(带有你的修正),你会发现它们实际上是偶数长度

想象一下“中午”,从第一个“o”(左和右)开始。匹配,然后移动它们-现在比较第一个“n”和第二个“o”。无益。但是有了这个修正,你开始比较两个“o”,然后移动到两个“n”

示例(使用
var oddPal=centeredPalindrome(i-1,i);
fix):

var longestPalindrome=函数(字符串){
var length=string.length;
var结果=”;
var centeredPalindrome=函数(左、右){
而(左>=0&&right1)
log(“oddPal:+oddPal”);
如果(evenPal.length>1)
console.log(“evenPal:+evenPal”);
如果(oddPal.length>result.length)
结果=oddPal;
if(evenPal.length>result.length)
结果=evenPal;
}
return“回文为:“+result+”,长度为:“+result.length;
};
console.log(
最长回文(“南正午更红”)

);如果更早地找到最大回文,这将是最佳选择。 一旦找到它,它将退出两个循环

function isPalindrome(s) {
      //var rev = s.replace(/\s/g,"").split('').reverse().join('');  //to remove space
      var rev = s.split('').reverse().join('');
      return s == rev;
    }

    function longestPalind(s) {
      var maxp_length = 0,
        maxp = '';
      for (var i = 0; i < s.length; i++) {
        var subs = s.substr(i, s.length);
        if (subs.length <= maxp_length) break; //Stop Loop for smaller strings
        for (var j = subs.length; j >= 0; j--) {
          var sub_subs = subs.substr(0, j);
          if (sub_subs.length <= maxp_length) break; // Stop loop for smaller strings
          if (isPalindrome(sub_subs)) {

              maxp_length = sub_subs.length;
              maxp = sub_subs;

          }
        }
      }
      return maxp;
    }
函数isAlindrome(s){
//var rev=s.replace(//\s/g,“”).split(“”).reverse().join(“”);//删除空格
var rev=s.split(“”).reverse().join(“”);
返回s==rev;
}
函数longestPalind(s){
var maxp_长度=0,
maxp='';
对于(变量i=0;i
  • 检查以确保提供的字符串不是回文。如果是,则完成。(最佳情况)
  • 最坏情况0(n^2)
  • 链接到

    使用动态规划。将每个问题分解成自己的方法,然后将每个问题的解决方案相加得到答案

    class Palindrome {
       constructor(chars){
         this.palindrome = chars;
         this.table = new Object();
         this.longestPalindrome = null;
         this.longestPalindromeLength = 0;
    
         if(!this.isTheStringAPalindrome()){
          this.initialSetupOfTableStructure();
         }
       }
    
       isTheStringAPalindrome(){
         const reverse = [...this.palindrome].reverse().join('');
         if(this.palindrome === reverse){
           this.longestPalindrome = this.palindrome;
           this.longestPalindromeLength = this.palindrome.length;
           console.log('pal is longest', );
           return true;
         }
       }
    
       initialSetupOfTableStructure(){
         for(let i = 0; i < this.palindrome.length; i++){
           for(let k = 0; k < this.palindrome.length; k++){
            this.table[`${i},${k}`] = false;
           }
         }
         this.setIndividualsAsPalindromes();
       }
    
       setIndividualsAsPalindromes(){
        for(let i = 0; i < this.palindrome.length; i++){
          this.table[`${i},${i}`] = true;
        }
        this.setDoubleLettersPlaindrome();
       }
    
       setDoubleLettersPlaindrome(){
         for(let i = 0; i < this.palindrome.length; i++){
           const firstSubstring = this.palindrome.substring(i, i + 1);
           const secondSubstring = this.palindrome.substring(i+1, i + 2);
          if(firstSubstring === secondSubstring){
           this.table[`${i},${i + 1}`] = true;
    
           if(this.longestPalindromeLength < 2){
             this.longestPalindrome = firstSubstring + secondSubstring;
             this.longestPalindromeLength = 2;
           }
          }
         }
         this.setAnyPalindromLengthGreaterThan2();
       }
    
       setAnyPalindromLengthGreaterThan2(){
         for(let k = 3; k <= this.palindrome.length; k++){
          for(let i = 0; i <= this.palindrome.length - k; i++){
            const j = i + k - 1;
            const tableAtIJ = this.table[`${i+1},${j-1}`];
            const stringToCompare = this.palindrome.substring(i, j +1);
            const firstLetterInstringToCompare = stringToCompare[0];
            const lastLetterInstringToCompare = [...stringToCompare].reverse()[0];
            if(tableAtIJ && firstLetterInstringToCompare === lastLetterInstringToCompare){
    
              this.table[`${i},${j}`] = true;
    
              if(this.longestPalindromeLength < stringToCompare.length){
                this.longestPalindrome = stringToCompare;
                this.longestPalindromeLength = stringToCompare.length;
              }
            }
          }
         }
       }
    
       printLongestPalindrome(){
         console.log('Logest Palindrome', this.longestPalindrome);
         console.log('from /n', this.palindrome );
       }
    
       toString(){
         console.log('palindrome', this.palindrome);
         console.log(this.table)
       }
     }
    
     // const palindrome = new Palindrome('lollolkidding');
     // const palindrome = new Palindrome('acbaabca');
     const palindrome = new Palindrome('acbaabad');
     palindrome.printLongestPalindrome();
     //palindrome.toString();
    
    类回文{
    建造师(chars){
    this.palindrome=chars;
    this.table=新对象();
    this.longestPalindrome=null;
    this.longestPalindromeLength=0;
    如果(!this.isTheStringAPalindrome()){
    这是.initialSetupOfTableStructure();
    }
    }
    IsthestingApalindrome(){
    常量reverse=[…this.palindrome].reverse().join(“”);
    if(this.palindrome==反向){
    this.longestPalindrome=this.palindrome;
    this.longestPalindromeLength=this.palindrome.length;
    log('pal最长',);
    返回true;
    }
    }
    initialSetupOfTableStructure(){
    for(设i=0;i函数最长回文组(str){
    var arr=str.split(“”);
    var endArr=[];
    对于(变量i=0;i2&&temp===temp.split(“”).reverse().join(“”){
    端推(温度);
    }
    }
    }
    var计数=0;
    var longestPalindrome=“”;
    对于(变量i=0;i=endArr[i].长度){
    最长回文组=endArr[i-1];
    }
    否则{
    count=endArr[i]。长度;
    }
    }
    控制台日志(endArr);
    console.log(最长回文);
    返回最长的回文;
    }
    最长回文(“abracadabra”);
    
    函数最长回文{
    如果(s==''){
    返回“”
    }
    设arr=[];
    让_s=s.分割(“”);
    for(设i=0;i<\u.length;i++){
    对于(设j=0;j<_.length;j++){
    让word=_.slice(0,j+1).join(“”);
    让rev_word=_.slice(0,j+1).reverse().join(“”);
    如果(字===修订字){
    arr.push(字)
    }
    }
    _s、 拼接(0,1)
    }
    设_arr=arr.sort((a,b)=>a.length-b.length);
    for(设i=0;i<_arr.length;i++){
    如果(_arr[arr.length-1].length==_arr[i].length){
    返回_arr[i]
    }
    }
    
    }

    最长回文('bbaaacc')
    //这段代码将为您提供字符串中第一个最长的回文子字符串

    YES-这最终是有意义的。当然,您会对回文行执行i+1,因为它们的“中心”是2 i
     public string LongestPalindrome(string s) {
           return LongestPalindromeSol(s, 0, s.Length-1);
     }
     public static string LongestPalindromeSol(string s1, int start, int end)
     {
            if (start > end)
            {
                return string.Empty;
            }
            if (start == end)
            {
                char ch = s1[start];
                string s = string.Empty;
                var res = s.Insert(0, ch.ToString());
                return res;
            }
            if (s1[start] == s1[end])
            {
                char ch = s1[start];
                var res = LongestPalindromeSol(s1, start + 1, end - 1);
                res = res.Insert(0, ch.ToString());
                res = res.Insert(res.Length, ch.ToString());
                return res;
            }
            else
            {
                var str1 = LongestPalindromeSol(s1, start, end - 1);
                var str2 = LongestPalindromeSol(s1, start, end - 1);
                if (str1.Length > str2.Length)
                {
                    return str1;
                }
                else
                {
                    return str2;
                }
            }
        }
    
    class Palindrome {
       constructor(chars){
         this.palindrome = chars;
         this.table = new Object();
         this.longestPalindrome = null;
         this.longestPalindromeLength = 0;
    
         if(!this.isTheStringAPalindrome()){
          this.initialSetupOfTableStructure();
         }
       }
    
       isTheStringAPalindrome(){
         const reverse = [...this.palindrome].reverse().join('');
         if(this.palindrome === reverse){
           this.longestPalindrome = this.palindrome;
           this.longestPalindromeLength = this.palindrome.length;
           console.log('pal is longest', );
           return true;
         }
       }
    
       initialSetupOfTableStructure(){
         for(let i = 0; i < this.palindrome.length; i++){
           for(let k = 0; k < this.palindrome.length; k++){
            this.table[`${i},${k}`] = false;
           }
         }
         this.setIndividualsAsPalindromes();
       }
    
       setIndividualsAsPalindromes(){
        for(let i = 0; i < this.palindrome.length; i++){
          this.table[`${i},${i}`] = true;
        }
        this.setDoubleLettersPlaindrome();
       }
    
       setDoubleLettersPlaindrome(){
         for(let i = 0; i < this.palindrome.length; i++){
           const firstSubstring = this.palindrome.substring(i, i + 1);
           const secondSubstring = this.palindrome.substring(i+1, i + 2);
          if(firstSubstring === secondSubstring){
           this.table[`${i},${i + 1}`] = true;
    
           if(this.longestPalindromeLength < 2){
             this.longestPalindrome = firstSubstring + secondSubstring;
             this.longestPalindromeLength = 2;
           }
          }
         }
         this.setAnyPalindromLengthGreaterThan2();
       }
    
       setAnyPalindromLengthGreaterThan2(){
         for(let k = 3; k <= this.palindrome.length; k++){
          for(let i = 0; i <= this.palindrome.length - k; i++){
            const j = i + k - 1;
            const tableAtIJ = this.table[`${i+1},${j-1}`];
            const stringToCompare = this.palindrome.substring(i, j +1);
            const firstLetterInstringToCompare = stringToCompare[0];
            const lastLetterInstringToCompare = [...stringToCompare].reverse()[0];
            if(tableAtIJ && firstLetterInstringToCompare === lastLetterInstringToCompare){
    
              this.table[`${i},${j}`] = true;
    
              if(this.longestPalindromeLength < stringToCompare.length){
                this.longestPalindrome = stringToCompare;
                this.longestPalindromeLength = stringToCompare.length;
              }
            }
          }
         }
       }
    
       printLongestPalindrome(){
         console.log('Logest Palindrome', this.longestPalindrome);
         console.log('from /n', this.palindrome );
       }
    
       toString(){
         console.log('palindrome', this.palindrome);
         console.log(this.table)
       }
     }
    
     // const palindrome = new Palindrome('lollolkidding');
     // const palindrome = new Palindrome('acbaabca');
     const palindrome = new Palindrome('acbaabad');
     palindrome.printLongestPalindrome();
     //palindrome.toString();
    
    This is in JS ES6. much simpler and works for almost all words .. Ive tried radar, redder, noon etc. 
    
    const findPalindrome = (input) => {
      let temp = input.split('')
      let rev = temp.reverse().join('')
    
      if(input == rev){
        console.log('Palindrome', input.length)
      }
    }
    //i/p : redder
    // "Palindrome" 6
    
    function longestPalindrome(str){
       var arr = str.split("");
       var endArr = [];
    
       for(var i = 0; i < arr.length; i++){
           var temp = "";
           temp = arr[i];
           for(var j = i + 1; j < arr.length; j++){
              temp += arr[j];
              if(temp.length > 2 && temp === temp.split("").reverse().join("")){
                 endArr.push(temp);
              }
       }
    }
    
    var count = 0;
    var longestPalindrome = "";
    for(var i = 0; i < endArr.length; i++){
       if(count >= endArr[i].length){
         longestPalindrome = endArr[i-1]; 
       }
       else{
          count = endArr[i].length;
       }
     }
     console.log(endArr);
     console.log(longestPalindrome);
     return longestPalindrome;
    }
    
    longestPalindrome("abracadabra"));
    
    function longest_palindrome(s) {
    if (s === '') {
        return ''
    }
    let arr = [];
    let _s = s.split('');
    for (let i = 0; i < _s.length; i++) {
        for (let j = 0; j < _s.length; j++) {
            let word = _s.slice(0, j + 1).join('');
            let rev_word = _s.slice(0, j + 1).reverse().join('');
            if (word === rev_word) {
                arr.push(word)
            }
        }
        _s.splice(0, 1)
    }
    let _arr = arr.sort((a, b) => a.length - b.length);
    for (let i = 0; i < _arr.length; i++) {
        if (_arr[arr.length - 1].length === _arr[i].length) {
            return _arr[i]
        }
    }
    
     public string LongestPalindrome(string s) {
           return LongestPalindromeSol(s, 0, s.Length-1);
     }
     public static string LongestPalindromeSol(string s1, int start, int end)
     {
            if (start > end)
            {
                return string.Empty;
            }
            if (start == end)
            {
                char ch = s1[start];
                string s = string.Empty;
                var res = s.Insert(0, ch.ToString());
                return res;
            }
            if (s1[start] == s1[end])
            {
                char ch = s1[start];
                var res = LongestPalindromeSol(s1, start + 1, end - 1);
                res = res.Insert(0, ch.ToString());
                res = res.Insert(res.Length, ch.ToString());
                return res;
            }
            else
            {
                var str1 = LongestPalindromeSol(s1, start, end - 1);
                var str2 = LongestPalindromeSol(s1, start, end - 1);
                if (str1.Length > str2.Length)
                {
                    return str1;
                }
                else
                {
                    return str2;
                }
            }
        }