如何删除所有非字母字符,javascript

How to remove all non-alphabet characters, javascript

我被要求检查一个字符串是否是回文。 不区分大小写。忽略所有不是字母的字符。

我的回答

 function palindrome(str) {
  var oldStr = str.toLowerCase().replace(/\s+|\,|\.|\_|\-|\:|\(|\)|\/|\/g,  '');

  var newStr = str.replace(/\s+|\,|\.|\_|\-|\:|\(|\)|\/|\/g, '').split("").reverse().join("").toLowerCase();

  if ( oldStr === newStr){
    return true;
  }
  else {
    return false;
  }
}
palindrome("ininiNI");

该函数将检查任何字符串的可能性。 例子: (0_0 (: /-\ :) 0-0") 根据要求应该return true.

我在 JavaScript 中找不到比上面那个更好的解决方案。

除了将每个可能的字符写成 removed/replaced 之外,还有 faster/better 方法吗? (特别是因为我写的内容远非详尽无遗...)

无需调用 toLowerCase() 和 replace() 两次。您也可以将字符串切成两半,反转一部分然后进行比较。这样你至少可以加快你的功能几倍。

优化后的函数可能是这样的:

function palindrome(str) {
  str = str.toLowerCase().replace(/[^a-z]/g, '');
  var max = str.length - 1;
  for (var i = Math.floor(max / 2); i >= 0; i--) {
    if (str[i] != str[max - i]) {
      return false;
    }
  }
  return true;
}

palindrome("inabcbani"); //true
palindrome("abcddcba"); //true
palindrome("a*#$(b)&^@%@%(*a"); //true
palindrome("abba"); //true
palindrome("abcdba"); //false

在我看来,For 循环将是最快的方法,因为它既快速又简单。一旦找到第一个不匹配的字符,您可以 return false。