[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]