https://leetcode.com/problems/longest-common-prefix/description/
题目大意:给一系列字符串strs,找最长的共同前缀
这题与最长公共子串,最长公共子序列的区别在于另两者都是两个串
之间的比对,而本题是多个串匹配,限制更多,相互影响,只要有两个串之间不存在公共,那所有串都不存在。
解题思路1:水平搜索。先找strs[0]和strs[1]的共同前缀(注意前缀必须是从头开始
的连续子串),以strs[0]为基准prefix,在strs[1]中找是否存在prefix前缀,若不存在,prefix尾部截去一个字符,成为新的prefix,继续在strs[1]中找,直到prefix为空串,此时strs[0]与strs[1]不存在共同前缀,推知所有的strs[i]不存在共同前缀。
若strs[0]与strs[1]有共同前缀,则记录为prefix,然后在strs[2]中继续找是否存在prefix前缀,以此类推,直到在所有串中找一遍。
代码:
class Solution:
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
n = len(strs)
if n == 0:
return ""
prefix = strs[0]
for i in range(1, n):
while strs[i].find(prefix) != 0: #用find方法找子串
prefix = prefix[:len(prefix)-1]
if prefix == "":
return prefix
return prefix
思路2:垂直搜索。与上面水平搜索的区别在于,水平是每个串之间比对一遍,垂直是以strs[0]为基准,对其每个字符,在所有串之间比对。好处在于如果有一个最短串位于strs[n-1],长度为p,水平搜索就要遍历所有的串,复杂度为len(strs[0] + strs[1] + ... + strs[n-1])
。而垂直搜索最多只遍历所有的串的前p位,复杂度为p * n = len(strs[n-1]) * n
,也就是说不用遍历所有的情况。
class Solution:
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
n = len(strs)
if n == 0: #边界条件,串数为0时,不存在str[0],需特殊处理
return ""
for i in range(0, len(strs[0])): #对基准串中的每一位
for j in range(1, n): #在所有串中寻找
if len(strs[j]) == i or strs[j][i] != strs[0][i]: #若找到一位与基准串不符,返回(前一个条件是为了防止越界)
return strs[0][:i]
return strs[0] #若能走出循环,说明str[0]整个串都符合