A phrase is a palindrome if, after converting all uppercase letters into lowercase letters and removing all non-alphanumeric characters, it reads the same forward and backward. Alphanumeric characters include letters and numbers.
Given a string s
, return true
if it is a palindrome, or false
otherwise.
Example 1:
Input: s = "A man, a plan, a canal: Panama" Output: true Explanation: "amanaplanacanalpanama" is a palindrome.
Example 2:
Input: s = "race a car" Output: false Explanation: "raceacar" is not a palindrome.
Example 3:
Input: s = " " Output: true Explanation: s is an empty string "" after removing non-alphanumeric characters. Since an empty string reads the same forward and backward, it is a palindrome.
Constraints:
1 <= s.length <= 2 * 105
s
consists only of printable ASCII characters.특수문자를 제거
하고, 소문자
로 모두 통일한 뒤 공백을 제거
한다. racecar
,otto
) 문자열 길이가 짝수일 때, 홀수일 때로 나눈다.reverse
를 사용해 뒤집어 비교한다. / 홀수라면 가운데에 있는 원소를 제외한 왼쪽 오른쪽을 나누고 오른쪽을 뒤집어(reverse) 비교한다./**
* @param {string} s
* @return {boolean}
*/
var isPalindrome = function(s) {
if(s.length===1) {
return true;
}
let left;
let right;
const reg = /[\{\}\[\]\/?.,;:|\)*~`!^\-_+<>@\#$%&\\\=\(\'\"]/gi; // 정규식
let str = s.replace(reg,''); // 특수문자 제거
str = str.toLowerCase().replace(/\s/g,''); //소문자 통일 & 공백제거
if(str.length%2 === 0) {
left = str.substring(0,str.length/2);
right = str.substring(str.length/2,str.length).split('').reverse().join('');
if(left===right) {
return true;
}else {
return false;
}
}else {
left = str.substring(0,str.length/2);
right = str.substring(str.length/2+1,str.length).split('').reverse().join('');
if(left===right) {
return true;
}else {
return false;
}
}
};
다른 사람의 풀이를 보니 내 코드가 확실히 길다는 것을 느꼈다. 굳이 반으로 나누지 않고 전체를 뒤집어 비교를 하면 되는구나... 줄여서 비교하면 성능이 좋지 않을까 했는데 런타임을 보니 그렇지도 않았다. 🫠
또 나는 문자열 1일때는 바로 true를 리턴처리 해주는게 굉장히 효과가 클 것이라고 생각했는데 막상 돌려보니 효과는 미미했다... ...
시간/공간복잡도 중요하지만 가독성과 코드의 낭비(?!)를 줄이는 것도 꽤 중요한 것이라는 걸 아래 코드를 보고 배웠다.
/**
* @param {string} s
* @return {boolean}
*/
var isPalindrome = function (s) {
let str = s.replace(/[^a-zA-Z0-9 ]/g, "").replace(/\s+/g, '');
function checkPalindrom(str) {
return str == str.split('').reverse().join('');
}
return checkPalindrom(str.toLowerCase());
};