题目来源:
题目分析:
本题是让我们写一个函数找到字符串数组中的最长公共子串。这是第一次让我有一点点思路的题目,奈何写代码的时候考虑的问题不太仔细全面,并且没有关注时间复杂度的问题,所以在网站上跑,理所当然的超时了。。。我的思路是:先找到这个字符串数组中最短的那个字符串,因为其公共前缀一定是最短的那个字符串的子集。然后通过二重循环来一个个比较元素,当遇到不一样的时候就直接输出最短字符串到那个元素的切片。把代码贴出来聊表纪念。
class Solution:
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
x=strs[0]
for i in range(len(strs)):
if (len(strs[i])<len(x)):
x=strs[i]
for j in range(len(x)):
for p in range(len(strs)):
if (strs[p]!=x):
if(strs[p][j]!=x[j]):
x=x[0:j]
return x
后来看到一个改进版本,我们所要知道最短的字符串并不是想确定它的位置,并让它与其他不同的值做比较,而是为了减少循环所用的时间,而我们可以把每个字符串都与第0个字符串进行比较,代码如下,不过还是通不过,很奇怪!
class Solution:
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
result=""
if(strs==""):
print("")
if (len(strs)==1):
print(strs)
minl=min(len(word) for word in strs)#这种写法需要掌握
for i in range(minl):
x=strs[0][i]
for j in range(len(strs)):
if(x!=strs[j][i]):
return result
result+=x
最后通过的是两位大神写的版本,其中一个的思路不是一位一位的比,而是将每个字符串与第0个字符串从左到右比较,直到遇到一个不匹配,然后继续下一个字符串。我将他的代码贴出:
class Solution:
# @return a string
def longestCommonPrefix(self, strs):
#横向扫描,每个字符串与第0 个字符串,从左到右比较,直到遇到一个不匹配,
#然后继续下一个字符串
#时间复杂度O(n1+n2+...)
if len(strs) == 0: return ""
minL = min([len(word) for word in strs])
for j in range(minL):
for i in range(1, len(strs)):
if strs[i][j] != strs[0][j]:
return strs[0][:j]
return strs[0][:minL]
还有一位大神的解答,我看得有点疑惑,可能是我的水平不够。在进行while循环的时候已经限定了j<MIn,那最后做判断的时候考虑j>Min这种情况有可能会实现吗?有哪个大神可以解解惑!
class Solution:
# @param {string[]} strs
# @return {string}
def longestCommonPrefix(self, strs):
if len(strs)==0:return ""
str=strs[0]
Min=len(str)
for i in range(1,len(strs)):
j=0;p=strs[i]
while j<Min and j<len(p) and p[j]==str[j]:j+=1
Min = Min if Min<j else j
return str[:Min]