JavaScript中的回文函数

时间:2017-01-15 15:57:37

标签: javascript regex palindrome

我需要帮助这个回文分配(对于从后面读取的单词,无论空格,符号和标点符号,都应该显示为真)。我没有看到这里的问题,但它没有正常工作。问题就像正则表达式不行,但我在regexr上测试了正则表达式,它应该没问题。

任何人都能看到问题所在?

提前致谢。

function palindrome(str) {

  var pal = str;

  pal.replace(/[\W_]/g, "");
  pal.toLowerCase();

  var arr = pal.split("");
  arr.reverse();
  var pal2 = arr.join("");

  if(pal2 === pal){
    return true;
  }
  else{
    return false;
  }

}


//this should show true but its false
palindrome("_eye");

1 个答案:

答案 0 :(得分:0)

就像我在评论中所说,你的代码不起作用,因为它假设replace()toLowerCase()都增加了他们的论点。但他们没有,他们返回一个新的字符串,而不是修改给定的字符串。因此,在您的示例中,_符号仍然存在于比较例程中,从而弄乱了预期的结果。

另一个旁注:当你将函数的结果基于某些比较操作时,不需要使用if。您可以随时替换它:

if (a === b) {
  return true;
}
else {
  return false;
}

......简单:

return a === b;

说到一般的任务:虽然分裂 - 反向连接 - 比较是最简单的方法(检查@ adeneo的评论是否很好的单线程),但它并不是最佳的。想一想:你只需要将字符串的两半相互比较。有一种方法可以做到:

function isDirectPalindrome(str) {
  var i = 0, j = str.length - 1;
  while (i < j) {
    if (str.charAt(i++) !== str.charAt(j--)) {
      return false;
    }
  }
  return true;
}

function isPalindrome(str) {
  return isDirectPalindrome(str.replace(/[\W_]+/g, '').toLowerCase());
}

这里有两个函数:第一个函数总是检查字符串的回文是否为(此处没有'noise'符号),第二个函数预先标准化字符串。这使得在需要时重用第一个更简单。

当然,这只是一个考验。但我觉得在这里显示算法和模块化点很方便 - 也很有用。