String 형인 str 인자에서 중복되지 않은 알파벳으로 이루어진 제일 긴 단어의 길이를 반환해주세요.
str: 텍스트 return: 중복되지 않은 알파벳 길이 (숫자 반환)
예를 들어,
str = "abcabcabc" return 은 3 => 'abc' 가 제일 길기 때문
str = "aaaaa" return 은 1 => 'a' 가 제일 길기 때문
str = "sttrg" return 은 3 => 'trg' 가 제일 길기 때문
중복되는 문자가 나올 경우, 그 이전부분을 다 날리고 중복되는 문자가 나온 시점부터 다시 시작하는 풀이
ex) 'abcaz' > abc / az return
값 = 3
def get_len_of_str(s):
a = []
max_len = 0
s_list = list(s)
# a 리스트에 있는 요소일 경우, 그 전까지의 리스트의 길이를 max_len에 저장
for i in s_list:
if i in a:
if len(a) > max_len:
max_len = len(a)
a = []
a.append(i)
# 마지막 요소가 a에 없어서 새로 추가되는 경우의 a길이
if len(a) > max_len:
max_len = len(a)
return max_len
중복되는 문자가 나올 경우, 앞에 이미 있던 중복되는 문자의 다음 문자부터 시작하는 풀이
ex) 'abcaz' > a / bcaz return
값 = 4
def get_len_of_str(s):
a_dict = {}
starting_point = 0
result = 0
for i, c in enumerate(s):
# if 조건 아래 추가 설명!
if c in a_dict and a_dict[c] >= starting_point:
starting_point = a_dict[c] + 1
a_dict[c] = i
result = max(result, i - starting_point + 1)
return result
Test Case
s = 'eacfczei'
두번째 e가 들어가는 경우,
a_dict
안에{'e': 0}
가 들어있고,starting_point=3
(첫번째 c의 다음인 f)인 상태이다.
if c in a_dict and a_dict[c] >= starting_point
c in a_dict
: 'e'가a_dict
안에 이미 있어야 하고,a_dict[c] >= starting_point
:
a_dict
안에 있는 'e'의 index가 0이고 현재starting_point=3
인데, 이 조건이 없다면starting_point=1
이 된다. -> 앞에서 지나온 'c'가 다시 중복되어 문자열에 포함되는 상황.
두 조건이 모두 충족되어야 한다!