使用 Javascript 评估字符串是否为回文的最有效方法是什么?



我是JavaScript的新手,并在下面编写了代码,以确定字符串是否为palindrome。我很好奇什么是完成相同任务的最有效方法。

var isPalindrome = function (string) {
    var leftString = [];
    var rightString = [];
    // Remove spaces in the string and convert to an array
    var strArray = string.split(" ").join("").split("");    
    var strLength = strArray.length;
    // Determine if the string is even or odd in length, then assign left and right strings accordingly
    if (strLength % 2 !== 0) {
        leftString = strArray.slice(0, (Math.round(strLength / 2) - 1));
        rightString = strArray.slice(Math.round(strLength / 2), strLength);
    } else {
        leftString = strArray.slice(0, (strLength / 2));
        rightString = strArray.slice((strLength / 2, strLength))
    }
    if (leftString.join("") === rightString.reverse().join("")) {
        alert(string + " is a palindrome.");
    } else {
        alert(string + " is not a palindrome.")
    }
}

isPalindrome("nurses run");

尚不清楚您是否在谈论代码长度或计算量的效率,但这在两个方面都应该相当好。它考虑了空间旁边的非阿尔法字符以及大写:

function isPalindrome(str) {
   var i, len;
   str = str.toLowerCase().replace(/[^a-z]/g, '');
   len = str.length;
   for(i = 0; i < len / 2; i += 1) {
      if(str.charCodeAt(i) != str.charCodeAt(len - i - 1)) {
         return false;
      }
   }
   return true;
}

一种较短的方法(尽管计算更密集):

function isPalindrome(str) {
   str = str.toLowerCase().replace(/[^a-z]/g, '');
   return str == str.split("").reverse().join("");
}

,如果您真的想要警报的内容,我建议将其放在单独的功能中:

function isPalindromeAlert(str) {
  alert(str + "is " + (isPalindrome(str) ? "" : "not ") + "a palindrome.");
}
function isPalindrome( s )
{
   var i = 0, j = s.length-1;
   while( i < j )
       if( s[i++].toLowerCase() != s[j--].toLowerCase() ) return false;
   return true;
}

我认为这更简单:

var isPalindrome = function (string) {
    if (string == string.split('').reverse().join('')) {
        alert(string + ' is palindrome.');
    }
    else {
        alert(string + ' is not palindrome.');
    }
}

请参阅更多:palindrome检查JavaScript

var str = "abcba";
var len = str.Lenght;
var index = 0;
while(index <= len/2 && str[index] == str[len - index - 1]) index++;
if(index == len/2) {
    alert(string + " is a palindrome.");
}
else {
   alert(string + " is not a palindrome.");
}

您进行了一些不必要的操作。

要高效,您应该避免不必要的计算。问问自己:

  • 您需要删除空间吗?
  • 您需要转换为数组吗?
  • 您需要为左右字符串分配新对象吗?
  • 您需要逆转字符串吗?

可以以非常简单的循环进行检查:

var len=string.length;
for (int i=0; i<(len/2); i++) {
  if (string[i] != string[len-i-1]) {
    alert(string + " is not a palindrome.");
    return;
  }
}
alert(string + " is a palindrome.");

要忽略空格和非α数字字符,它可以按照以下方式重写:

function isAlphaNumeric( chr ) {
  return ( ((c >= 'a') && (c <= 'z')) ||
           ((c >= 'A') && (c <= 'Z')) ||
           ((c >= '0') && (c <= '9')) );
}
// Note - template taken from @Matt's answer!
function isPalindrome( string ) {
  var i = 0, j = s.length-1;
  while( i < j ) {
    if (isAlphaNumeric(string[i])) {
      if (isAlphaNumeric(string[j])) {
        if ( string[i++].toLowerCase() != string[j--].toLowerCase() ) 
          return false;
      } else {
        j--;
      }
    } else {
      i++;
      if (!isAlphaNumeric(string[j])) j--;
    }
  }
  return true;
}

不可读 无与伦比的 TERSE 有效 递归 非分支

function isPalindrome(s,i) {
 return (i=i||0)<0|| i>=s.length/2|| s[i]==s[s.length-1-i]&& isPalindrome(s,++i);
}

小提琴:http://jsfiddle.net/namcx0yf/

最新更新