str: 텍스트
return: 중복되지 않은 알파벳 길이 (숫자 반환)
예를 들어,
str = "abcabcabc"
return은 3
=> 'abc' 가 제일 길기 때문
str = "aaaaa"
return은 1
=> 'a' 가 제일 길기 때문
str = "sttrg"
return은 3
=> 'trg' 가 제일 길기 때문
def get_len_of_str(s):
if len(s) == 0: # 문자열의 길이가 0일때 0을 리턴.
return 0
map = {} # 중복되지 않는 문자열과 그 인덱스를 딕셔너리에 추가
max_length = start = 0 # 최대길이와 스타트 인덱스는 0에서 시작
for i in range(len(s)):
if s[i] in map and start <= map[s[i]]: #중복 문자열이 이미 딕셔너리에 존재하며, 스타트 인덱스가 중복 문자열의 인덱스보다 작거나 같은 경우, (abcabc에서 두번째 a가 등장했을때)
start = map[s[i]] + 1 # 스타트 인덱스 위치를 최초 중복 문자열의 인덱스에 1을 더하여 slide 시킴 (abcabc의 경우, a가 아니라 b 부터 길이를 재도록, 중복 문자열이 나올때마다 최초 중복 문자열을 제외하고 다시 카운트가 시작되도록 )
else: # 중복 문자열이 딕셔너리에 존재하지 않는 경우,
max_length = max(max_length, i - start + 1) # 최대 길이는, 현재 최대 길이와 현재 문자열의 인덱스에서 스타트 인덱스를 뺀 문자열의 길이(길이를 구하므로 1을더해줌) 둘 중에 max값으로 지정.
map[s[i]] = i # 해당 요소의 철자를 key, 인덱스 값을 value로 하여 map 딕셔너리에 추가.
return (max_length)
def get_len_of_str(s):
dct = {} # 중복되지 않는 문자열과 그 인덱스를 딕셔너리에 추가
max_so_far = curr_max = start = 0 # 지금까지 최대길이, 현재 최대길이, 스타트 인덱스는 0부터 시작
for index, i in enumerate(s): # enumerate를 사용하여 문자열과 index를 딕셔너리에 저장
if i in dct and dct[i] >= start: # 해당 문자열이 이미 딕셔너리에 존재하며, value가 스타트 값보다 큰 경우
max_so_far = max(max_so_far, curr_max) # 지금까지 최대길이는, 지금까지 최대길이와 현재 최대길이중의 max값
curr_max = index - dct[i] # 현재 최대길이는 새로운 중복 문자열의 인덱스에서 최초 중복 문자열의 인덱스를 뺀 값으로 갱신
start = dct[i] + 1 #스타트 인덱스는 최초 중복 문자열에 1을 더한 장소로 slide시킴
else: # 해당 문자열이 딕셔너리에 존재하지 않는 경우
curr_max += 1 # 현재 최대길이를 1씩 증가시키고,
dct[i] = index # dct에 key가 해당 문자열, value가 해당 문자열의 인덱스 값으로 하여 요소를 저장
return max(max_so_far, curr_max)