--- tags: data_structure_python --- # Longest Common Prefix <img src="https://img.shields.io/badge/-easy-brightgreen"> Write a function to find the longest common prefix string amongst an array of strings. If there is no common prefix, return an empty string "". <ins>**Example 1:**</ins> >Input: ["flower","flow","flight"] >Output: "fl" <ins>**Example 2:**</ins> >Input: ["dog","racecar","car"] >Output: "" >Explanation: There is no common prefix among the input strings. **Note:** All given inputs are in lowercase letters a-z. ## Solution ### Solution 1: Naive approach ```python= class Solution: def longestCommonPrefix(self, strs: List[str]) -> str: n = len(strs) if n == 0: return "" commonPrefix = strs[0] for i in range(1, n): j, accu, isSameLetter = 0, "", True minLen = min(len(commonPrefix), len(strs[i])) while j < minLen and isSameLetter: if commonPrefix[j] == strs[i][j]: accu += commonPrefix[j] else: isSameLetter = False j += 1 commonPrefix = accu return commonPrefix ``` ### Solution 2: Divide and Conquer ```python= class Solution: def __commonPrefix(self, lcpLeft, lcpRight): n, m = len(lcpLeft), len(lcpRight) minLen = min(n, m) commonPrefix = "" for i in range(0, minLen): if lcpLeft[i] == lcpRight[i]: commonPrefix += lcpLeft[i] else: return commonPrefix return commonPrefix def __longestCommonPrefixDC(self, strs, l, r): if l == r: return strs[l] else: mid = int((l+r) / 2) # Divide. lcpLeft = self.__longestCommonPrefixDC(strs, l, mid) lcpRight = self.__longestCommonPrefixDC(strs, mid + 1, r) # Conquer. return self.__commonPrefix(lcpLeft, lcpRight) def longestCommonPrefix(self, strs: List[str]) -> str: # V3: Divide and Conquer. if strs == None or len(strs) == 0: return "" else: return self.__longestCommonPrefixDC(strs, 0, len(strs)-1) ```