Search code examples
javascriptregexstringreplacepalindrome

How to remove all non-alphabet characters, javascript


I am asked to check if a string is a Palindrome. To not be case sensitive. To ignore all characters that are not letters.

My Answer

 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");

The function is to be checked with any string possibility. Example: ("0_0 (: /-\ :) 0-0") Which according to the requirements should return true.

I could not find a better solution in JavaScript then the one above.

Is there a faster/better way than just writing out each possible character to be removed/replaced? (especially since what I wrote is far from exhaustive...)


Solution

  • There is no need to call toLowerCase() and replace() twice. You can also cut string in a half, reverse one part and then compare. That way you can speed up your function few times at least.

    Optimized function may look like that:

    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 loop will be the fastest way in my opinion as it's quick and simple. You can return false once you find first character that doesn't match.