/**
* @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/