Leetcode 14.Longest Common Prefix——python (easy)

題目來源:

題目分析:

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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章