유효한 회문
Valid Palindrome - LeetCode
Can you solve this real interview question? Valid Palindrome - A phrase is a palindrome if, after converting all uppercase letters into lowercase letters and removing all non-alphanumeric characters, it reads the same forward and backward. Alphanumeric cha
leetcode.com
모든 대문자를 소문자 로 변환하고 영숫자가 아닌 모든 문자를 제거한 후 앞뒤로 동일하게 읽는 경우 구문은 회문 입니다. 영숫자 문자에는 문자와 숫자가 포함됩니다.
주어진 문자열이 회문 이면s 반환하고 , 그렇지 않으면 반환합니다 .true / false
예시 1:
입력: s = "사람, 계획, 운하: 파나마"
출력: true
설명: "amanaplanacanalpanama"는 회문입니다.
예 2:
입력: s = "race a car"
출력: false
설명: "raceacar"는 회문이 아닙니다.
예시 3:
입력: s = " "
출력: true
설명: s는 영숫자가 아닌 문자를 제거한 후의 빈 문자열 ""입니다.
빈 문자열은 앞뒤로 동일하게 읽으므로 회문입니다.
제약:
- 1 <= s.length <= 2 * 105
- s인쇄 가능한 ASCII 문자로만 구성됩니다.
1.첫번째 시도
public boolean isPalindrome(String s) {
s = s.toLowerCase(); //소문자 변환
s = s.replaceAll("[^A-Za-z0-9]",""); //정규 표현식 사용하여 영숫자 제외 모두 제거
int start = 0 ;
int end = s.length()-1;
for(int i = 0 ; i < s.length() ; i ++){
if(!(s.charAt(start) == s.charAt(end)) ){
return false;
}
start++;
end--;
}
return true;
}
문제 접근방법
- 첫번째 조건 "대문자를 소문자로 변환하고" 이 조건을 봤을 때 딱 생각나는 것은 String 함수의 toLowerCase()가 생각나서 적용하여 해결하였다.
- 두번째 조건 "영숫자가 아닌 모든 문자를 제거한 후" 이 조건은 정규표현식을 사용하여 영숫자가 아닌 문자를 제거하였다.
- 세번째 조건 "앞뒤로 동일하게 읽는 경우" 이 조건 중 앞뒤 라는 단어를 보고 딱 생각 났던 것은 Two Pointers 패턴으로 해결하면 되겠다고 생각하였습니다. 그리하여 start 포인트 하나와 end 포인트 하나를 설정하여 두 문자를 비교하며 해결하였습니다.
회고
public static boolean isPalindrome(String s) {
//sol2 => Runtime 39 ms Memory 40.4 MB
return new StringBuilder().append(s).reverse().toString()
.replaceAll("[^a-zA-Z0-9]", "").toLowerCase()
.equals(s.replaceAll("[^a-zA-Z0-9]", "").toLowerCase()) ? true: false;
}
다른 사람들은 어떻게 풀었는지 찾아 보았습니다.
위에 코드를 보면 큰틀의 생각은 대부분 같았습니다 (대소문자,특정문자 제거 등)
하지만 StringBuilder를 사용해서 한줄로 해결 하는 방법은 생각지도 못했습니다.
문자열 하면 String만 떠올랐던 나자신에게 반성하고
StringBuilder,Stringbuffer 등 다양한 클래스들의 용도와 특징을 공부해야겠다는 생각이 들었습니다.
'알고리즘' 카테고리의 다른 글
[Binary Search] Search Insert Position (0) | 2023.08.28 |
---|---|
[Linked List] Linked List Cycle (0) | 2023.08.28 |
Rotate Array (0) | 2023.08.25 |
Remove Duplicates from Sorted Array (0) | 2023.08.24 |
Best Time to Buy and Sell Stock (0) | 2023.08.23 |