最长公共前缀-Python
-
最长公共前缀编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。
- 示例 1:输入: ["flower","flow","flight"]输出: "fl"示例
- 2:输入: ["dog","racecar","car"]输出: ""解释: 输入不存在公共前缀。
-
思路1:可循环遍历列表中每个字符串,判断字符串相同的位置的字母是否相等,如果相等则记录字母并判断下一个字母,否则就返回记录的字符串。
mls1 = ["flower","flow","flight"] mls1 = ["dog","racecar","car"] def mfun(mls1): mls2 = [] # 用来记录相同的字母 if len(mls1) == 0: return '' # 如果列表为空,直接返回 num = 0 for k in mls1: # 循环字符串,找到最短的长度,作为最长公共子串的最长长度 if len(k) > num: num = len(k) for i in range(num): # i 为下标值 for j in mls1: # 将列表中每个字符串的第 i 个字母添加到列表中 mls2.append(j[i]) if (len(set(mls2))) == 1: # 对列表进行集合操作,如果集合后长度为1 则 # 这几个字母相同,继续判断下一个字母 mls2.clear() else: # 如果长度不为1, 最长公共子串已经找到, # print(i) if j[0:i:1]: # 切片操作找到 最长公共子串 return (j[0:i:1]) else: return "" print(mfun(mls1)) -
思路2:可以运用Python 中的内置函数zip ,方便的判断最长公共子串。
def mfun2(strs): ans = '' # 定义空字符串,准备用来存放最长公共子串 for i in zip(*strs): # *strs 将列表解包成几个字符串元素 if len(set(i)) == 1: # 判断zip后的元素的集合的长度,如果=1, # 说明几个字母相等,追加到最长公共子串中 ans += i[0] else: # 否则就是不相等。 break return ans -
zip函数解析:
zip(iterable, iterable, ...) # zip的参数是多个迭代器, 返回值为 几个元组作为元素的列表。 # zip 类似于矩阵操作: 例如: zip('123', '456', '789') 操作过程: 1 2 3 4 5 6 7 8 9 ====> 将行变成列,将列变成行,组成列表返回 1 4 7 2 5 8 3 6 9 ====> [(1, 4, 7), (2, 5, 8), (3, 6, 9)] for i in zip('123', '456', '789'): print(i) ('1', '4', '7') ('2', '5', '8') ('3', '6', '9') >>>a = [1,2,3] >>> b = [4,5,6] >>> c = [4,5,6,7,8] >>> zipped = zip(a,b) # 打包为元组的列表 [(1, 4), (2, 5), (3, 6)] >>> zip(a,c) # 元素个数与最短的列表一致 [(1, 4), (2, 5), (3, 6)] >>> zip(*zipped) # 与 zip 相反,*zipped 可理解为解压,返回二维矩阵式 [(1, 2, 3), (4, 5, 6)]

浙公网安备 33010602011771号