您的位置:首页 > 其它

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

Mingw_ 2020-03-15 18:22 25 查看 https://blog.csdn.net/mingw_/a

  【前言】坚持日更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

  运行结果:

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

  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

  运行结果:

  

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

  运行结果:

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

  Python zip函数
  Python map函数


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

  官方解答链接


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

  注明:

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

  • 点赞 2
  • 收藏
  • 分享
  • 文章举报
Mingw_ 发布了36 篇原创文章 · 获赞 64 · 访问量 2786 私信 关注
标签: