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)

댓글남기기