[Leetcode] 14. Longest Common Prefix

bradley·2022년 6월 3일
1

Algorithm

목록 보기
6/12

Problem

Solution

1) 단순 리스트 이중 반복

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        if not strs:
            return ""
        
        shortest = min(strs, key=len) # 길이를 기준으로 최소 길이를 갖는 문자열을 찾는다.
        
        for i, ch in enumerate(shortest): # 최소 길이 문자열의 문자를 하나씩 iteration
            for other in strs: # 리스트의 다른 문자열과 비교
                if other[i] != ch: # 동일한 위치에 있는 문자와 비교해서 다르다면
                    return shortest[:i] # 다르기 전까지의 문자만 return
        return shortest

2) all() 활용

all() 연산때문에 비교 연산을 일찍 종료할 수 없음. LCP가 사전에 확정되어도 나머지 비교도 진행되는 문제가 생긴다

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        longest_pre = ""
        if not strs:
            return longest_pre
        
        shortest_str = min(strs, key=len)
        
        for i in range(len(shortest_str)):
						"""
						startswith 부분
						: 리스트 내 문자열이 최소 길이 문자열의 현재 반복 위치까지의 문자열과 동일하면 True 아니면 False
						all 부분
						: 모두 True가 될 때 해당 문자열까지만 longest_pre로 바인딩, False가 나오면 반복 이탈 후 return
						"""
            if all([x.startswith(shortest_str[:i+1]) for x in strs]):
									# 최소 길이 문자열의  
                longest_pre = shortest_str[:i+1]
            else:
                break
        return longest_pre     

3) 덧셈 활용한 비교

2) 솔루션의 비교 조기 종료가 안되는 문제를 아래와 같이 해결

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        if not strs:
            return ""
        
        shortest_str = min(strs, key=len)
        
        for i in range(len(shortest_str)):
						# 최소 길이의 문자와 리스트 내 문자열의 문자를 비교할 때 틀리면 1을 sum한 뒤 True 조건문을 만듬
            if sum(1 for s in strs if shortest_str[i] != s[i]) > 0:
                return shortest_str[:i]
        return shortest_str
profile
데이터 엔지니어링에 관심이 많은 홀로 삽질하는 느림보

0개의 댓글