Codecata ⎜ 문자열 중 중복되지 않은 제일 긴 단어 길이 반환
문자열 중 중복되지 않은 제일 긴 단어 길이 반환
문제
String 형인 str 인자에서 중복되지 않은 알파벳으로 이루어진 제일 긴 단어의 길이를 반환해주세요.
str: 텍스트 return: 중복되지 않은 알파벳 길이 (숫자 반환)
예를 들어, str = “abcabcabc” return은 3 => ‘abc’ 가 제일 길기 때문
str = “aaaaa” return은 1 => ‘a’ 가 제일 길기 때문
str = “sttrg” return은 3 => ‘trg’ 가 제일 길기 때문
str = “abcade” return은 5 => ‘bcade’ 가 제일 길기 때문
내가 한 풀이
접근방법
빈 string(temporary용)과 dictionary를 우선 만들어줬다.
단어가 중복되기 전까지 string에 넣다가 중복이 되면 dictionary string과 len(string)을 옮겨주고 string은 초기화시켜 이 과정을 반복했다.
이 와 같이 했을 때 중복되는 단어를 기준으로 string 분리가 가능하고 string의 문자 길이를 알 수 있다.
하지만 문제가 있었다..
문제점 string = “abcade” 와 같은 경우 내가 만든 알고리즘에 따르면 dictionary에 {“abc”:3, “ade”:3}로 저장이 됐다. 중복되는 단어 ‘a’가 발생하는 지점에서 분리가 되기 때문이다.
def get_len_of_str(string):
temp_str = ""
my_dic = {}
for word in string:
if word not in temp_str:
temp_str += word
else:
my_dic[temp_str] = len(temp_str)
temp_str = ""
temp_str += word
my_dic[temp_str] = len(temp_str)
print(my_dic)
max_length = max(my_dic.values())
return max_length
print(get_len_of_str("abcabcded"))
print(get_len_of_str("abssd"))
print(get_len_of_str("sttrg"))
print(get_len_of_str("abcade"))
위코드 풀이
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)
댓글남기기