JavaScript - Check If a String is Palindrom


Return true if the given string is a palindrome. Otherwise, return false.
A palindrome is a word or sentence that's spelled the same way both forward and backward, ignoring punctuation, case, and spacing.
Note:



  • You'll need to remove all non-alphanumeric characters (punctuation, spaces and symbols) and turn everything into the same case (lower or upper case) in order to check for palindromes.

  • We'll pass strings with varying formats, such as "racecar", "RaceCar", and "race CAR" among others.

  • We'll also pass strings with special symbols, such as "2A3*3a2", "2A3 3a2", and "2_A3*3#A2".


Solution 1 Basic approach


function palindrome(str) {
    var letters = str.toLowerCase().replace(/[^A-Za-z0-9]/g, '')
    let str1 = letters.split("").reverse().join()
    let str2 = letters.split("").join()
    if (str1 === str2) {
        return true
    }
    return false
}
console.log(palindrome("0_0 (: /-\ :) 0-0"));







Output:


true

Solution 2


//This solution performs at minimum 7x better, at maximum infinitely better.
//read the explanation for the reason why.
function palindrome(str) {
    //assign a front and a back pointer
    let front = 0;
    let back = str.length - 1;

    //back and front pointers won't always meet in the middle, so use (back > front)
    while (back > front) {
        //increments front pointer if current character doesn't meet criteria
        if (str[front].match(/[\W_]/)) {
            front++;
            continue;
        }
        //decrements back pointer if current character doesn't meet criteria
        if (str[back].match(/[\W_]/)) {
            back--;
            continue;
        }
        //finally does the comparison on the current character
        if (str[front].toLowerCase() !== str[back].toLowerCase()) return false;
        front++;
        back--;
    }

    //if the whole string has been compared without returning false, it's a palindrome!
    return true;
}
console.log(palindrome("0_0 (: /-\ :) 0-0"));




Output:


true

Solution 3 One-liner approach



function palindrome(str) {
    return (
        str.replace(/[\W_]/g, "").toLowerCase() ===
        str
            .replace(/[\W_]/g, "")
            .toLowerCase()
            .split("")
            .reverse()
            .join("")
    );
}
console.log(palindrome("0_0 (: /-\ :) 0-0"));




Output:


true