原题:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入: [“flower”,“flow”,“flight”]
输出: “fl”
示例 2:
输入: [“dog”,“racecar”,“car”]
输出: “”
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
解法一(并联扫描法):
先获取最小的字符串。遍历列表strs的每个字符串,不断比较这些字符串的同一位置的字符,如果相同则继续比较下一位,不同则返回刚刚已经比较过的字符。
class Solution(object):
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
if strs==[]:
return ""
elif len(strs) ==1:
return strs[0]
ans = min(strs, key=len)
if ans=="":
return ""
for i in range(len(ans)):
for j in range(len(strs)-1):
if strs[j][i] != strs[j + 1][i]:
return ans[:i]
return ans
解法二:扫描法
程序一
以第一个字符串为样本,去和strs[1:]的所有字符串进行比较,如果相同则直接返回结果,如果不同则将第一个字符串进行pop操作直到相同,接着继续和后面的字符串进行比较。
说白了就是一个优先处理的思想,我先让前面的n个都存在一个公共最长前缀,之后再与后面的字符串求公共最长前缀。
class Solution(object):
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
if len(strs) == 0:
return ""
prefix = strs[0]
for i in range(len(strs)):
while strs[i].find(prefix) !=0: # 判断是否存在这个字符串,不存在就进行while操作
prefix = prefix[:len(prefix) - 1]
if prefix == "":
return ""
return prefix
程序二
程序二在时间复杂度上进行了一些优化。在多次测试效果下,时间消耗是远低于程序一的。
class Solution(object):
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
if len(strs) == 0:
return ""
prefix = min(strs,key=len)
for i in range(len(strs)):
while strs[i].find(prefix) !=0: # 判断是否存在这个字符串,不存在就进行while操作
prefix = prefix[:len(prefix) - 1]
if prefix == "":
return ""
return prefix