Kaan G
Kaan G

Reputation: 219

Palindrome Checker need a hand

I'm working on freeCodeCamp's Palindrome Checker. My code is a bit messy but it pretty works on every test except the nineth one. palindrome("almostomla") should return false but in my code it returns trueinstead. I think my nineth code has a little problem but couldn't solve that. I wonder where am I missing something.

function palindrome(str) {
    let str1 = str.replace(/[^a-zA-Z\d:]/gi, '');
    let str2 = str1.replace(/,/gi, '');
    let str3 = str2.replace(/\./gi, '');
    let str4 = str3.replace(/_/, "-");
    let myStr = str4.toLowerCase(); //My string is ready for play

        for (let i = 0; i < myStr.length; i++) {
            if (myStr[i] != myStr[myStr.length - (i+1)]) { //I think there is a little mistake on this line
                return false;
            } else {
                return true;
            }
        }

Upvotes: 1

Views: 56

Answers (1)

CertainPerformance
CertainPerformance

Reputation: 371029

The problem is that you're only checking the first and last characters of the string. You should return true only after all iterations have finished:

function palindrome(str) {
  let str1 = str.replace(/[^a-zA-Z\d:]/gi, '');
  let str2 = str1.replace(/,/gi, '');
  let str3 = str2.replace(/\./gi, '');
  let str4 = str3.replace(/_/, "-");
  let myStr = str4.toLowerCase(); //My string is ready for play

  for (let i = 0; i < myStr.length; i++) {
    if (myStr[i] != myStr[myStr.length - (i + 1)]) {
      return false;
    }
  }
  return true;
}
console.log(palindrome("almostomla"));
console.log(palindrome("foof"));
console.log(palindrome("fobof"));
console.log(palindrome("fobbf"));

Note that your initial regular expression is sufficient - it removes all characters that aren't alphabetical, numeric, or :, so the other 3 regular expressions you run later are superfluous. Since you're using the i flag, you can also remove the A-Z from the regex:

const stringToTest = str.replace(/[^a-z\d:]/gi, '');

It would also probably be easier just to .reverse() the string:

function palindrome(str) {
  const strToTest = str.replace(/[^a-z\d:]/gi, '');
  return strToTest.split('').reverse().join('') === strToTest;
}
console.log(palindrome("almostomla"));
console.log(palindrome("foof"));
console.log(palindrome("fobof"));
console.log(palindrome("fobbf"));

Upvotes: 1

Related Questions