125. Valid Palindrome

늘보·2021년 10월 12일

LeetCode

목록 보기
40/69

💡 풀이

/**
 * @param {string} s
 * @return {boolean}
 */
var isPalindrome = function (s) {
  let start = 0;
  let end = s.length - 1;

  while (start < end) {
    let sCode = s.charCodeAt(start);
    let eCode = s.charCodeAt(end);

    if (!isLetter(sCode)) {
      start++;
      continue;
    }

    if (!isLetter(eCode)) {
      end--;
      continue;
    }

    if (toLowerCase(sCode) !== toLowerCase(eCode)) return false;

    start++;
    end--;
  }
  return true;
};

const isLetter = code => {
  if (
    (code >= 48 && code <= 57) || // 숫자
    (code >= 65 && code <= 90) || // 대문자
    (code >= 97 && code <= 122) // 소문자
  )
    return true;
  else return false;
};

const toLowerCase = code => {
  if (code >= 65 && code <= 90) return code + 32;
  else return code;
};

// 65 ~ 90 : A ~ Z
// 97 ~ 122: a ~ z

let s = 'A man, a plan, a canal: Panama';
isPalindrome(s);

📝 정리

문자열을 다루는데 연습하기 좋은 문제였다. palindrome이란, 거꾸로 뒤집어도 같은 문자열인지 말하는 것이다. (예를 들어, 'aaacaaa'는 palindrome이 맞다.)

palindrome 자체를 판별하는 건 어렵지 않다. 두 개의 포인터를 이용해 반복문을 돌 때마다 start index는 하나씩 더해주고, end index는 하나씩 빼주면 된다. 만약 하나씩 빼다가 s[start]와 s[end]가 다르다면 바로 false를 return 해주면 된다.

문제는 공백이나 대문자, 특수문자 등이 들어가는 경우였는데, 이런 경우에 판별함수를 따로 만들어서(isLetter), 대문자를 소문자로 바꿔주는 함수를 만들어서(toLowerCase) 문제를 풀었다.

수정, 지적을 환영합니다!

문제 링크

https://leetcode.com/problems/valid-palindrome/

LeetCode GitHub

https://github.com/tTab1204/LeetCode

0개의 댓글