Leetcode - Valid Palindrome

Yuni·2023년 8월 27일
0

Algorithm

목록 보기
25/27
post-thumbnail

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.

Approach

EN

KR

  1. 팰린드롬은 앞뒤가 똑같은 문자열을 말한다.(대,소문자는 구별하지 않고 특수문자는 고려하지않는다.) 고로 1글자 짜리 문자열이라면 뒤집거나 말거나 같은 글자이기 때문에 제일 첫번째로 true를 리턴한다.
  2. 문자열 길이가 1글자 이상이라면 정규식으로 특수문자를 제거하고, 소문자로 모두 통일한 뒤 공백을 제거한다.
  3. 팰린드롬은 짝수/홀수 문자열로도 모두 가능하므로(e.g) racecar,otto) 문자열 길이가 짝수일 때, 홀수일 때로 나눈다.
  4. 문자열 길이가 짝수라면 정확히 반으로 쪼갠 뒤 오른쪽을 reverse를 사용해 뒤집어 비교한다. / 홀수라면 가운데에 있는 원소를 제외한 왼쪽 오른쪽을 나누고 오른쪽을 뒤집어(reverse) 비교한다.

code

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

    
};


Review

다른 사람의 풀이를 보니 내 코드가 확실히 길다는 것을 느꼈다. 굳이 반으로 나누지 않고 전체를 뒤집어 비교를 하면 되는구나... 줄여서 비교하면 성능이 좋지 않을까 했는데 런타임을 보니 그렇지도 않았다. 🫠
또 나는 문자열 1일때는 바로 true를 리턴처리 해주는게 굉장히 효과가 클 것이라고 생각했는데 막상 돌려보니 효과는 미미했다... ...

시간/공간복잡도 중요하지만 가독성과 코드의 낭비(?!)를 줄이는 것도 꽤 중요한 것이라는 걸 아래 코드를 보고 배웠다.

code

/**
 * @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());
};
profile
Look at art, make art, show art and be art. So does as code.

0개의 댓글