LeetCode每日一题--最长公共前缀

  【前言】坚持日更LeetCode刷题系列

   不积跬步,无以至千里;不积小流,无以成江海。愿与诸君共勉!


  【题目】14.最长公共前缀

   题目描述:编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

  示例:

    示例 1:   
    	输入: ["flower","flow","flight"]
    	输出: "fl"
       
    示例 2:
    	输入: ["dog","racecar","car"]
    	输出: ""

  思路一:纵向扫描。找出列表中长度最短的字符串,遍历该字符串的每一个元素,与列表中其他字符串相应位置的字符进行比较,若相同则继续,否则退出循环。实现代码如下:

def getlen(elem):
    return len(elem)
class Solution(object):
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        if len(strs) == 0 :   #列表无字符串的特殊情况
            return ""
        else:
            strs.sort(key=getlen) #按照字符串的长度进行排序
            if(len(strs[0])==0):  #传入的第一个字符串为空的特殊情况
                return ""
            else:
                flag = 1          #设立标志,判断是否结束循环
                for i in range(len(strs[0])):   #进行纵向扫描
                    for j in range(1,len(strs)):
                        if strs[j][i] != strs[0][i]:
                            flag = 0
                            break
                    if(flag==0):
                        i = i-1  #取上一个相等的字符
                        break
                if(i<0):
                    return ""
                else:
                    return strs[0][:i+1]  #由于遍历的时候不包含右端元素,因此i+1

  运行结果:
LeetCode每日一题--最长公共前缀_第1张图片
  关于其中一些知识的链接:

  List.sort方法


  思路二:来源于LeeCode某大佬的评论,利用python的max()和min(),在Python里字符串是可以比较的,按照ascII值排,举例abb, aba,abac,最大为abb,最小为aba。所以只需要比较最大最小的公共前缀就是整个数组的公共前缀

 def longestCommonPrefix(self, strs):
        if not strs: 
        	return ""
        s1 = min(strs)
        s2 = max(strs)
        for i,x in enumerate(s1):
            if x != s2[i]:
                return s2[:i]
        return s1

  运行结果:
LeetCode每日一题--最长公共前缀_第2张图片

  Notice:比较方式:从前往后按位比,ascII是和字符对应的,不是整个字符串,所以按位比较,当前面的几位字符相等时当前位要是大于或小于那就不用往后比了


  思路三:来源于LeeCode某大佬的评论,利用python的zip函数,把str看成list然后把输入看成二维数组,左对齐纵向压缩,然后把每项利用集合去重,之后遍历list中找到元素长度大于1之前的就是公共前缀。

def longestCommonPrefix(self, strs):
        if not strs: return ""
        ss = list(map(set, zip(*strs)))
        res = ""
        for i, x in enumerate(ss):
            x = list(x)
            if len(x) > 1:
                break
            res = res + x[0]
        return res

  运行结果:

LeetCode每日一题--最长公共前缀_第3张图片

  关于其中一些知识的链接:

  Python zip函数
  Python map函数


  更多思路:来源于官方,主要有分治思想,二分查找,trie字典树,下方附上原地址链接。

  官方解答链接


  分享就到这里了,欢迎大家一起交流讨论。

  注明:

  题目来源:力扣(LeetCode)
  链接:https://leetcode-cn.com/problems/longest-common-prefix/

你可能感兴趣的:(LeetCode每日一题--最长公共前缀)