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]  




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