LSGO——LeetCode實戰(數組系列):14題 最長公共前綴(Longest Common Prefix)

原題:

編寫一個函數來查找字符串數組中的最長公共前綴。

如果不存在公共前綴,返回空字符串 “”。

示例 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章