# 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"
Input: s = "race a car"
Constraints:
|
#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[시작, 끝, 단계]
문자열 조작할 때는 속도가 빠른 슬라이싱 우선 사용!
'Algorithm > LEET CODE ( 파이썬 알고리즘 인터뷰)' 카테고리의 다른 글
[LEET CODE] 5. Longest Palindromic Substring (0) | 2021.03.16 |
---|---|
[LEET CODE] 49. Group Anagrams (dict 자료형, sort(), sorted()) (0) | 2021.03.15 |
[LEET CODE] 819. Most Common Word ( 정규표현식 ) (0) | 2021.03.15 |
[LEET CODE] 937. Reorder Data in Log Files ( lambda 함수, 문자열 확인 함수 ) (0) | 2021.03.14 |
[LEET CODE] 344. Reverse String (0) | 2021.03.04 |