[LeetCode] 125번 - Valid Palindrome [Java][C++]
[LeetCode] 125번 - Valid Palindrome [Java][C++]
1. 아이디어
주어진 문자열이 팰린드롬인지 판단하는 문제로 이때 알파벳이나 숫자가 아닌 문자는 제거하고 알파벳은 소문자로 치환한 후 팰린드롬이 되는지 판단하는 문제다. 해당 문제는 투 포인터를 활용하면 해결할 수 있는데 주어진 문자열의 양 끝에서부터 서로 교차하는 방향으로 포인터를 진행시키는데 알파벳이나 숫자가 아닌 문자는 건너뛰고 알파벳 대문자는 소문자로 변환한 후 두 포인터가 가리키는 문자가 일치하면 각 포인터를 서로를 향하는 방향으로 한 칸 이동시키는 과정을 두 포인터가 교차할 때까지 반복하여 두 포인터가 교차하면 팰린드롬이 됨을 알 수 있다.
2. 복잡도
| 시간복잡도 | 공간복잡도 |
|---|---|
| $O(N)$ | $O(1)$ |
$N$ = 문자열
s길이
3. 코드
풀이 [Java][C++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
public boolean isPalindrome(String s) {
int left = 0;
int right = s.length() - 1;
while (left < right) {
char l = s.charAt(left);
if (!('0' <= l && l <= '9' || 'a' <= l && l <= 'z' || 'A' <= l && l <= 'Z')) {
left++;
continue;
}
char r = s.charAt(right);
if (!('0' <= r && r <= '9' || 'a' <= r && r <= 'z' || 'A' <= r && r <= 'Z')) {
right--;
continue;
}
if (Character.toLowerCase(l) != Character.toLowerCase(r)) return false;
left++;
right--;
}
return true;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool isPalindrome(string s) {
int left = 0;
int right = s.size() - 1;
while (left < right) {
char l = s[left];
if (!('0' <= l && l <= '9' || 'a' <= l && l <= 'z' || 'A' <= l && l <= 'Z')) {
left++;
continue;
}
char r = s[right];
if (!('0' <= r && r <= '9' || 'a' <= r && r <= 'z' || 'A' <= r && r <= 'Z')) {
right--;
continue;
}
if (tolower(l) != tolower(r)) return false;
left++;
right--;
}
return true;
}
};
This post is licensed under CC BY 4.0 by the author.