설명#
임의의 ASCII 문자열
S가 주어졌을때, 모음{'a','e','i','o','u'}를 각각 짝수번 포함(0번도 가능) 하고 있는 부분 문자열 중 가장 긴 길이를 구하여라
"leetcodeisgreat"=>"leetc"=> 5
💡풀이#
처음에 투포인터 문제인줄 알아서 많이 헤멨다
- 첫 상태를 정의한다 ( 모든 모음이 0번 나타난 상태)
- 모음을 2의 제곱 비트로 정의하고, 모음이 나타날때마다 비트마스크를 업데이트한다. 이전에 기록되지 않았다면 map에 넣는다
- 비트마스크가 이미 존재한다면, 이전 비트마스크와 현재 비트마스크 사이에는 모든 모음이 짝수번 존재하므로, 최대길이와 비교한다
코드#
class Solution:
def findTheLongestSubstring(self, s: str) -> int:
vowels = {'a': 1<<0, 'e': 1<<1, 'i': 1<<2, 'o': 1<<3, 'u': 1<<4}
# vowels = {'a':1, 'e': 2, 'i': 3, 'o': 4, 'u': 5} # 왜 안되는지 모르겠다면, 3인 경우를 생각해보자
my_map ={ 0 : -1}
mask = 0
answer= 0
for i,c in enumerate(s):
if c in vowels:
mask ^= vowels[c]
if mask not in my_map:
my_map[mask] = i
else :
answer = max(answer, i-my_map[mask])
return answer😎그다지 어렵진 않지만, 풀이가 재미있는 문제였다.