leetcode14.最长公共前缀
发布于 2021-04-17 05:40 ,所属分类:知识学习综合资讯
题目描述
题目描述
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串""。
示例
输入:strs = ["flower","flow","flight"]
输出:"fl"
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
(左右滑动查看完整内容)
提示
0 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i]仅由小写英文字母组成
难度:简单
标签:字符串
分析和题解
方法一
1.最长公共前缀的特点: 公共前缀必然存在于列表中的每一个字符串;
2.如果不存在公共前缀,返回空字符串"";
3.初始化公共前缀为列表的第一个元素,用公共前缀与列表第二个元素开始进行逐一对比每个字符,字符不一致时就取不一致之前的字符为公共前缀,不需要遍历剩余字符;
4.不用每次都比较整个字符串,只比较当前的公共前缀长度即可,因为公共前缀必然越来越小;如果公共前缀为空,就不需要遍历列表剩余的元素了。
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if not strs: # 如果不存在公共前缀,返回空字符串 ""
return ""
public_res = strs[0] # 初始化公共前缀为列表的第一个元素
for ele in strs[1:]: # 从列表的第二个元素开始循环判断
len_res = len(public_res)
if len_res: # 如果公共前缀不为空,进行元素判断
for j in range(len(ele)):
# 循环遍历当前元素的每个字符,与公共前缀对应的字符进行判断
if j < len_res:
if ele[j] != public_res[j]:
public_res = public_res[:j] # 如果对应字符不一致,公共前缀就取对应字符之前的内容
break
else: break # 如果当前元素比公共前缀的长度长,超出的部分就不进行判断了
else:
public_res = ele
else: break # 如果公共前缀为空,就不用判断后面的字符串了
return public_res
(左右滑动查看完整代码)
方法二
1.找出列表中字典序最小和最大的字符串,因为这两个字符串的差别是最大的,最长公共前缀即为这两个字符串的公共前缀;
2.列表中的元素全部为字符串时,字符串比较采用的是 ”字典序“(通过 ASCII 对字符进行排序),即比较当前字符大小,若当前字符小则此字符串较小,若相等则继续往后比较,直到某一字符不相等或某一字符串比较结束,比较结束都相等,则长度小的字符串较小。
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if not strs: # 如果不存在公共前缀,返回空字符串 ""
return ""
strs.sort() # 列表从小到大排序
min_str = strs[0] # 列表中最小的字符串
max_str = strs[-1] # 列表中最大的字符串
'''
这两行相当于上面三行代码
min_str = min(strs) # 列表中最小的字符串
max_str = max(strs) # 列表中最大的字符串
'''
for i in range(len(min_str)):
if min_str[i] != max_str[i]:
return min_str[:i] # 如果对应字符不一致,公共前缀就取对应字符之前的内容
return min_str
(左右滑动查看完整代码)
方法三
1.取列表中每个字符串相同下标的字符, 看是否相同;
2.zip(*str) 将 str 中所有字符串并列到迭代器中,逐次并列返回 str 中所有字符串相同下标的字符 合并成的元组(元组个数与最短的字符串长度一致);
3.通过set()去重,判断每个字符串相同下标的字符 是否相同,如果相同就把这个字符放在公共前缀中。
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
public_res = ''
for i in zip(*strs): # 使用 zip 根据字符串下标合并成元组
if len(set(i)) == 1: # 把元组通过 set 去重,判断元组中元素是否都相同
public_res += i[0] # 如果相同就把这个元素放在公共前缀中
else:
break
return public_res
(左右滑动查看完整代码)
相关资源