題目來源:
題目分析:
本題是讓我們寫一個函數找到字符串數組中的最長公共子串。這是第一次讓我有一點點思路的題目,奈何寫代碼的時候考慮的問題不太仔細全面,並且沒有關注時間複雜度的問題,所以在網站上跑,理所當然的超時了。。。我的思路是:先找到這個字符串數組中最短的那個字符串,因爲其公共前綴一定是最短的那個字符串的子集。然後通過二重循環來一個個比較元素,當遇到不一樣的時候就直接輸出最短字符串到那個元素的切片。把代碼貼出來聊表紀念。
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]