【前言】坚持日更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
运行结果:
关于其中一些知识的链接:
思路二:来源于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
运行结果:
关于其中一些知识的链接:
更多思路:来源于官方,主要有分治思想,二分查找,trie字典树,下方附上原地址链接。
分享就到这里了,欢迎大家一起交流讨论。
注明:
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-common-prefix/