포스트

Valid Palindrome

LeetCode 125. Valid Palindrome

원문

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 letterss and numbers.

Given a string s, return true if it is a palindrome, or false otherwise.

풀이

문자열의 양 끝에서부터 하나씩 비교하다 다른 문자가 나오면 False를 반환하고, 중간 지점까지 확인을 마치고 반목문을 빠져나오면 True를 반환한다.
이때 숫자 또는 로마자가 아닌 문자는 무시하고 그 다음 문자를 비교한다.
가령, 앞쪽의 인덱스를 i, 뒤쪽의 인덱스를 j라고 했을 때 i번째 문자가 특수문자 혹은 공백이라면 i에 1을 더해주고 j번째 문자가 그렇다면 j에서 1을 뺀다.

코드

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution:
    def isPalindrome(self, s: str) -> bool:
        lo, hi = 0, len(s) - 1

        while lo < hi:
            if not s[lo].isalnum(): lo += 1
            elif not s[hi].isalnum(): hi -= 1
            else:
                if s[lo].lower() != s[hi].lower(): return False
                else:
                    lo += 1
                    hi -= 1

        return True

파이썬의 .isalnum() 메서드는 해당하는 문자열(또는 문자)이 alphanumeric하면 True를, 아니면 False를 반환한다.

비슷한 메서드로는 .isalpha(), .isascii(), .isdecimal(), .isdigit(), .isnumeric() 등이 있다.

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
    public boolean isPalindrome(String s) {
        int lo = 0;
        int hi = s.length() - 1;
        int n = s.length();

        while (lo < hi) {
            while (lo < n && !Character.isLetterOrDigit(s.charAt(lo))) {
                lo++;
            }
            while (hi > -1 && !Character.isLetterOrDigit(s.charAt(hi))) {
                hi--;
            }
            if (lo > hi) break;
            if (Character.toLowerCase(s.charAt(lo)) !=
                Character.toLowerCase(s.charAt(hi))) {
                    return false;
                }
            
            lo++;
            hi--;
        }

        return true;
    }
}

Python의 .isalnum()과 유사한 Character.isLetterOrDigit()를 사용했다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.