【LeetCode】14. 最长公共前缀

155 阅读2分钟

image.png

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

image.png

  • 题目示例

image.png

  • 题目解析

    • 根据题目的描述我们可以知道,输入的内容是一组字符串,都是由小写字母字符组成的
    • 输出的结果,字符串公共的前缀

二、思路分析:

我们拿到本题,脑袋里面想到最简单的方法纵向对比每一个字符串的字符如下:

  • 找到列表中长度最短的字符串
  • 在最短字符串中分别取出每个一个字符,与列表中一系列字符串每一个字符串进行比较
  • 在列表最短的字符串为空时,直接就返回空

image.png

按照上述的思路,我们使用python实现出,代码如下:

class Solution(object):
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        Min = min(strs)
        len_num = len(strs)
        List = []

        if len(Min) ==0:
            return ""
        for index in range(len(Min)+1):    
            num = 0
            for n in range(len_num):
                if index == 0:
                    if Min[index] in strs[n]:
                        if Min[index] != strs[n][0]:
                            return ""
                        else:
                            num += 1
                else:
                    if Min[0:index] in strs[n]:
                        if index < len(strs[n]):
                            if Min[0:index] == strs[n][0:index]:
                                num +=1
                        else:
                            if Min[0:index] == strs[n][:]:
                                num +=1


            if num == len_num:
                if index ==0:
                    List.append(Min[index])
                else:
                    List.append(Min[0:index])
        
        if len(List) == 0:

            return ""
        else:
            return max(List)

查看解析,对比大佬们实现,上述代码太复杂且低效,俗称低质量代码。

我们来优化一下上述代码。

  • 首先我们对输出的strs 进行升序排序,则strs[0]就是我们最短的字符串
  • 我们直接将最短字符串和最长字符创建,进行对比就可以得出公共的字符串前缀
class Solution(object):
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """

        strs.sort()

        start = strs[0]
        end = strs[len(strs)-1]
        res = ""
        for i in range(len(start)):

            if  i < len(end) and start[i] == end[i]:
                res += start[i]
            else:
               break
        return  res

第一种代码实现和第二种代码,直观感受就是简洁明了。

当然速度也是有一定的提高。

三、总结:

我们提交代码,可以AC结果。 image.png

第一种方式:时间复杂度O(mn),空间复杂度O(n) 第二种方式:时间复杂度O(n),空间复杂度O(1)