"A man, a plan, a canal: Panama"
출력true
"race a car"
출력false
'팰린드롬'이란
앞뒤가 똑같은 단어나 문장. 뒤집어도 같은 말이 되는 단어 또는 문장. 우리말로는 회문.
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
def isPalindrome(self, s: str) -> bool:
# 자료형 데크로 선언
strs: Deque = 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()
은 O(n) 이지만 데크의 popleft()
는 O(1) 이다.def isPalindrome(self, s: str) -> bool:
s = s.lower()
# 정규식으로 불필요한 문자 필터링
s = re.sub('[^a-z0-9]', '', s)
return s == s[::-1] # 슬라이싱
문자열 슬라이싱
문자열을 조작할 때는 항상 슬라이싱을 우선으로 사용하는 편이 속도 개선에 유리.
S[:]
: 사본. 참조가 아닌 값 복사.
S[::-1]
: 뒤집는다.
bool isPalindrome(char *s) {
int bias_left = 0;
int bias_right = 1;
int str_len = strlen(s);
for (int i = 0; i < str_len; i++) {
// 스킵 포인터 처리
while (!isalnum(s[i + bias_left])) {
bias_left++;
if (i + bias_left == str_len)
return true;
}
while (!isalnum(s[str_len - i - bias_right])) {
bias_right++;
}
if (i + bias_left >= str_len - i - bias_right)
break;
// 팰린드롬 비교
if (tolower(s[i + bias_left]) != tolower(s[str_len - i - bias_right]))
return false;
}
return true;
}
char.isalnum()
: 영문자, 숫자 여부 판별 함수char.lower()
: 소문자 변환 함수list.pop(i)
: 리스트에서 인덱스 위치를 가져오는 함수deque.popleft()
: 데크에서 가장 왼쪽의 것을 가져오는 함수S[:]
: 문자열 값 복사S[::-1]
: 문자열 뒤집기