[Algorithm] LeetCode #125 - Valid Palindrome


개요

LeetCode #125, Valid Palindrome 문제를 풀어봅니다.

Given a string s, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.

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.

Constraints:

  • 1 <= s.length <= 2 * 105
  • s consists only of printable ASCII characters.

LeetCode는 Solution class 안에서 작동하게 만들어 놓아서 제시된 template 그대로 가져왔습니다. isPalindrome 함수는 문자열을 받아서 알파벳과 숫자만 뽑아 리스트에 담고, 리스트 양 끝에서 하나씩 pop으로 가져와서 (pop이니 리스트에서 사라집니다) 비교 후 계속 같은지를 체크합니다.

isPalindrome_ver2 함수는 정규식으로 알파벳과 숫자만 남기고 뒤집은 문자열과 같은지 직접 비교합니다.


import re

class Solution:
    
    def isPalindrome(self, s: str) -> bool:
        strs = []

        for char in s:
            # 영문, 숫자 판별 isalnum()
            if char.isalnum():
                strs.append(char.lower())

        while len(strs) > 1:
            # 리스트 맨 앞, 맨 뒤 비교해서 같아야 됨. 뽑아서 비교하고 날려버릴 것 
            if strs.pop() != strs.pop(0):
                return False

        return True

    def isPalindrome_ver2(self, s: str) -> bool:
        s = s.lower()
        
        # 정규식으로 알파벳, 숫자 아닌 것을 날려버림
        s = re.sub('[^a-z0-9]', '', s)
        
        # s[::-1] : 뒤집어줌.
        # s[::1] : 그대로
        # s[::2]: 2칸씩 앞으로 이동
        return s == s[::-1]






© 2021.03. by JacobJinwonLee

Powered by theorydb