1371. Find the Longest Substring Containing Vowels in Even Counts
제약 사항
1 <= s.length <= 5 x 10^5
1. Brute Force
2. 비트 마스킹
1. 모음을 비트 위치에 매핑
모음 | 비트 위치 (0-based) | 비트 값 (1 << index ) |
---|---|---|
a | 0 | 00001 (1) |
e | 1 | 00010 (2) |
i | 2 | 00100 (4) |
o | 3 | 01000 (8) |
u | 4 | 10000 (16) |
a, e, i, o, u
를 5개의 비트(0~4번 비트)에 매핑한다.2. XOR 연산을 이용한 등장 횟수 표현
각 모음이 등장할 때마다 해당 비트를 XOR 연산을 통해 토글 시킨다.
XOR의 특징 - 같은 값을 두 번 XOR 하면 원래 값으로 돌아감
1010 ^ 1010 = 0000
3. 비트마스크 값이 이전에 등장했는지 확인
class Solution {
public:
int getIndex(char c){
if(c == 'a'){
return 0;
}
else if(c == 'e'){
return 1;
}
else if(c == 'i'){
return 2;
}
else if(c == 'o'){
return 3;
}
else if(c == 'u') {
return 4;
}
return -1;
}
int findTheLongestSubstring(string s) {
int arr[33];
for(int i = 0 ; i<33; i++){
arr[i] = -2;
}
int mask = 0;
int answer = 0;
arr[0] = -1;
for(int i = 0 ; i<s.length(); i++){
int index = getIndex(s[i]);
if(index != -1){
mask ^= (int)pow(2, index);
}
if(arr[mask] != -2){
answer = max(answer, i - arr[mask]);
} else {
arr[mask] = i;
}
}
return answer;
}
};