String 형인 str 인자에서 중복되지 않은 알파벳으로 이루어진 제일 긴 단어의 길이를 반환해주세요.
str: 텍스트
return: 중복되지 않은 알파벳 길이 (숫자 반환)
예를 들어,
str = "abcabcabc"
return은 3
=> 'abc' 가 제일 길기 때문
str = "aaaaa"
return은 1
=> 'a' 가 제일 길기 때문
str = "sttrg"
return은 3
=> 'trg' 가 제일 길기 때문
def get_len_of_str(string):
new_str = str()
str_dict = dict()
for i in range(len(string)):
if string[i] in new_str:
str_dict[new_str] = len(new_str)
new_str = str()
new_str += string[i]
else:
new_str += string[i]
if i == len(string)-1:
str_dict[new_str] = len(new_str)
if str_dict == {}:
result = 0
else:
result = max(str_dict.values())
return result
일단 for문을 돌면서 중복이 나오기 전까지의 알파벳을 new_str
에 저장한다. 만약 중복이 발생하면 지금까지 저장했던 new_str
을 len과 함께 str_dict
에 저장한다.(ex. {'abc':2})
그리고 new_str
을 다시 리셋한 후 중복이 없는 새로운 알파벳들을 담는다. 그리고 또 중복이 발생하면 str_dict
에 저장하는 것을 반복한다.
맨 처음에는 생각없이 len을 key로 잡아서 알파벳들이 제대로 카운트 되지 않는 문제가 발생했었는데(동일한 len이 발생했을때 누락되는 알파벳 생김) 알파벳을들을 key로 하니 제대로 잘 카운트 되었다.
마지막에 완성된 str_dict
의 value들 중 가장 큰 값을 return하면 된다.
ex) 만약 string이 abcabcdabcdef가 주어졌다면..
str_dict = {'abc':3, 'abcd':4, 'abcdef':6}
def get_len_of_str(s):
dct = {}
max_so_far = curr_max = start = 0
for index, i in enumerate(s):
if i in dct and dct[i] >= start:
max_so_far = max(max_so_far, curr_max)
curr_max = index - dct[i]
start = dct[i] + 1
else:
curr_max += 1
dct[i] = index
return max(max_so_far, curr_max)
나랑 비슷한 논리로 푼 것 같은데 너무 복잡해서 이해하려다가 실패했다 ㅠ
https://wikidocs.net/16045
https://stackoverflow.com/questions/27272034/what-is-a-b-c-in-python