
3.1 题目描述
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z
。
3.2 解题思路
- 使用zip函数将字符串数组内的每个字符串对应位置集合起来变成一个元组
- 利用set集合判定元组内元素是否一样
- 判断set集合长度即可得知每个字符串对应位置的字符是否一致
3.3 代码展示
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
"""
function:
判定一个字符串列表中最长的公共前缀,没有输出""
parameter:
字符串数组
return:
字符串
"""
self.strs = strs
res = ''
for tmp in zip(*self.strs):
tmp_set = set(tmp)
if len(tmp_set) == 1:
res += tmp[0]
else:
break
return res
改进思路
- 思路1:python中字符串也是可以比较的,他是按照每个字符的ASCII码进行比较,比如aba,abac,abb中最大的是abb,最小的是aba。
class Solution:
def longestCommonPrefix(self, strs) -> str:
"""
function:
判定一个字符串列表中最长的公共前缀,没有输出""
parameter:
字符串数组
return:
字符串
"""
self.strs = strs
if self.strs: #首先要评定数组是否为空,如果为空,max()和min()函数无法执行
max_str = max(self.strs)
min_str = min(self.strs)
for i,x in enumerate(min_str):
if x != max_str[i]:
return min_str[:i]
return min_str
else:
return ""
- 思路2:利用find()函数,取第一个字符串,依次于后面的字符串比较
class Solution:
def longestCommonPrefix(self, strs) -> str:
"""
function:
判定一个字符串列表中最长的公共前缀,没有输出""
parameter:
字符串数组
return:
字符串
"""
self.strs = strs
if not self.strs: #先判定是否为空,因为后面需要对数组经常操作
return ""
res = self.strs[0]
i = 1
while i < len(self.strs):
while self.strs[i].find(res) != 0: #find()函数如果查到:返回查找的第一个出现的位置;否则,返回-1。
res = res[:-1]
i += 1
return res
- 思路3:利用os.path.commonprefix(list),返回list(多个路径)中,所有path共有的最长的路径
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
return os.path.commonprefix(strs)
知识点
- zip()和zip(*)函数的使用
x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
xyz = zip(x, y, z) #将三个列表的对应位置元素集合在一个元组内,然后多个元组构成一个列表;如果列表长度不一致,取最短的
print(list(xyz))
x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
xyz = zip(x, y, z) #此时xyz为[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
u = zip(*xyz) #zip(*xyz)等价于zip((1, 4, 7), (2, 5, 8), (3, 6, 9))
print (list(u)) #所以u又变成了[(1, 2, 3), (4, 5, 6), (7, 8, 9)]
# 总结一句话,zip()相当于压缩,zip(*)相当于解压,只是两者的输入不同而已
- set集合:集合中不会存在相同的元素
- max()和min()函数执行时,如果对象为空,必须指定参数default(用来返回默认值)
- find()函数如果查到:返回查找的第一个出现的位置;否则,返回-1。
- os.path.commonprefix(list),返回list(多个路径)中,所有path共有的最长的路径