==============================================================================
【id】#14
【title】Longest Common Prefix
【description】
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 “”.
Example 1:
Input: [“flower”,“flow”,“flight”]
Output: “fl”
Example 2:
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.
【idea】
参考leetcode官网。
Horizontal scanning
垂直比较。先把第一个字符串当作前缀,比较紧邻的下一个字符串,获取二者的共同子串。依次向后比较获取最后的公共子串。
【code】
class Solution:
def longestCommonPrefix(self, strs):
if len(strs) == 0: return ''
prefix = strs[0]
for i in range(1, len(strs)):
while not strs[i].startswith(prefix):
prefix = prefix[:-1]
return prefix
【idea】
水平比较
就是找到一个最短的字符串,依次比较list中的其他字符串,找到最长的公共子串。
【code】
class Solution:
def longestCommonPrefix(self, strs):
if len(strs) == 0: return ''
shortest = min(strs, key = len)
# print(shortest)
for i ,v in enumerate(shortest):
for x in strs:
if x[i] != v:
return shortest[:i]
return shortest
【idea】
二分查找。将list中的第一个字符串二分,high为list中最短的长度,依次去匹配list中 的其他字符串获取最大公共子串。
【code】
class Solution:
def longestCommonPrefix(self, strs):
if len(strs) == 0 or '' in strs: return ''
minlen = min( map(lambda x : len(x) ,strs))
low = 0
high = minlen
while high >= low:
middle = (low+high)/2
if self.isCommonprefix(strs,middle):
low = middle+1
else:
high = middle-1
return strs[0][:(low+high)/2] if (low+high)>=0 else ''
def isCommonprefix(self, strs, position):
prefix = strs[0][:position] if position!= 0 else strs[0][0]
for i in range(1,len(strs)):
if not strs[i].startswith(prefix):
return False
return True