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
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
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