原題:
編寫一個函數來查找字符串數組中的最長公共前綴。
如果不存在公共前綴,返回空字符串 “”。
示例 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