본문 바로가기
Algorithm/LEET CODE ( 파이썬 알고리즘 인터뷰)

[LEET CODE]127. Valid Palindrome

by newnu 2021. 3. 3.
반응형

# Problem

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.

#My Answer

class Solution(object):
    def isPalindrome(self, s):
        l=[] #answer list
        s = s.lower()
        for i in s:
            if i.isalnum(): # only alphanumeric characters
                l.append(i)
                
        if len(l)<2: #길이가 1이면 항상 펠린드롬
            return True
            
        front =0
        end =len(l)-1
        while front<end:
            if l[front]==l[end]:
                front+=1
                end-=1
                if end-front==0: # len(l) is odd -> front=end 
                    return True
            else:
                return False
        return True # len(l) is even -> front>end 

# Solution 1 - 리스트로 변환

class Solution:
    def isPalindrome(self, s: str) -> bool:
        strs = []
        for char in s:
            if char.isalnum():
                strs.append(char.lower())

        # 팰린드롬 여부 판별
        while len(strs) > 1:
            if strs.pop(0) != strs.pop():
                return False

        return True

문자열 판별 내장함수

isalnum() - 영문자, 숫자 여부 판별

isalpha() - 영문자 판별

isdigit() - 숫자 판별

 

list 는 인덱스를 지정하여 pop 가능

길이가 홀수인 펠린드롬 - 마지막에 하나 남음 -> while문 빠져나와서 return True

길이가 짝수인 펠린드롬 - 마지막에 모두 pop 되고 길이 0 -> while문 빠져나와서 return True

 

# Solution 2 - 데크 자료형을 이용한 최적화

import collections
from typing import Deque

class Solution:
    def isPalindrome(self, s):
        # 자료형 데크로 선언
        strs = collections.deque()

        for char in s:
            if char.isalnum():
                strs.append(char.lower())

        while len(strs) > 1:
            if strs.popleft() != strs.pop():
                return False

        return True

리스트의 pop(0) 은 시간복잡도가 O(n)

데크의 popleft()는 시간복잡도가 O(1)

 

# Solution 3 - 정규표현식, 슬라이싱 사용

import re

class Solution:
    def isPalindrome(self, s):
        s = s.lower()
        # 정규식으로 불필요한 문자 필터링 (영문자,숫자만 남기기)
        s = re.sub('[^a-z0-9]', '', s)

        return s == s[::-1]  # 슬라이싱

re.sub('패턴', '바꿀 문자열', '문자열', 바꿀횟수)

문자열에서 패턴을 찾아서 바꿀문자열으로 바꾸기

 

s[::-1] 반대로 뒤집기

s[시작, 끝, 단계]

 

문자열 조작할 때는 속도가 빠른 슬라이싱 우선 사용!

반응형