一、题目描述:
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""
。
示例1:
输入:strs = ["flower","flow","flight"] 输出:"fl"
示例2:
输入:strs = ["dog","racecar","car"] 输出:""
提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i]
仅由小写英文字母组成
二、答题
1、分析题目
最长公共前缀,这个前缀满足所有字符串,且若有,一定在最短的字符串中。所以从该字符串长度开始递减寻找。
2、思路1 找最短长度,普通横向寻找
先找最短字符串长度,再从该长度递减,直到该长度满足所有字符串即可,只要这个前缀不在随意一个字符串中,都是不满足条件的。
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
min_length = len(strs[0])
length_true = True # 设置判断该长度前缀是否符合所有字符串
# 找最短字符串,需要最短长度
for i in range(1, len(strs)):
if len(strs[i]) < min_length:
min_length = len(strs[i])
# 或者一行代码:min_length = min([len(i) for i in strs])
# 对比列表中的字符串,从最短字符串长度开始长度减小
# 可用字符串切片来对比前缀
for i in range(min_length, 0, -1):
length_true = True
for j in range(0, len(strs)):
if min_str[0:i] != strs[j][0:i]: # 比较
length_true = False
break
if length_true: # 经过一轮,若长度符合则满足条件
return (min_str[0:i])
return "" # 所有的都不行,返回空字符产
3、思路2 使用set函数纵向对比寻找
在对比寻找前缀是否满足条件时,可以将每个字符串的同一位置的字符取出形成一个集合,若集合长度大于1,则不符合条件。
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
min_length = min(len(i) for i in strs)
min_str = ""
for i in range(min_length):
if len(set(s[i] for s in strs)) > 1: # set函数去重
break
min_str += strs[0][i]
return min_str
4、思路3 使用内置函数zip+set
使用zip函数取出每个单词相同位置的字母,这些字母会形成元组(zip()返回的是一个zip对象,需要通过list()转换成列表),将元组去重,如果去重后字母集合长度为1,说明该位置字符相同,就加入min_str,否则直接退出返回(默认从第一个字符开始)。
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
min_str = ''
for i in list(zip(*strs)):
if len(set(i)) == 1:
min_str += i[0]
else:
break
return min_str
# strs = ["flower","flow","flight"]
# print(list(zip(*strs)))
# 输出:[('f', 'f', 'f'), ('l', 'l', 'l'), ('o', 'o', 'i'), ('w', 'w', 'g')]
文章参考leetcode作者lgl1227。写博客方便记录,回忆,整合。