问题描述:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入: ["flower","flow","flight"]输出: "fl"
示例 2:
输入: ["dog","racecar","car"]输出: ""解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z
。
方法1:
贪心:将第一个串和第二个串进行比较,得出的最长前缀再与剩下的进行比较。(48ms)
1 class Solution(object): 2 def longestCommonPrefix(self, strs): 3 """ 4 :type strs: List[str] 5 :rtype: str 6 """ 7 if len(strs)>1: 8 9 s0 = strs[0]10 s1 = strs[1]11 elif len(strs) == 1:12 return strs[0]13 else:14 return ""15 common = ""16 flag = True17 i = 018 while flag and i < len(s0) and i < len(s1):19 if s0[i] == s1[i]:20 common += s0[i]21 else:22 flag = False23 i += 124 for i in range (2,len(strs)):25 c = strs[i]26 j = 027 common2 = ""28 while j < len(c) and j < len(common):29 if c[j] == common[j]:30 common2 += c[j]31 j += 132 else:33 break34 common = common235 return common
方法2(官方):
利用min和max函数,找出List中最小值元素s1和最大值元素s2,纪录s1中和s2字符不相同时候的下标,进行截断处理。(24ms)
1 if not len(strs):2 return ''3 s1 = min(strs)4 s2 = max(strs)5 for n, s in enumerate(s1):6 if not s2[n] == s:7 return s1[:n]8 return s1
注:enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
>>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']>>> list(enumerate(seasons))[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]>>> list(enumerate(seasons, start=1)) # 小标从 1 开始[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
>>>seq = ['one', 'two', 'three']>>> for i, element in enumerate(seq):... print i, element... 0 one1 two2 three
方法3:
1 ans = ""2 3 for i in zip(*strs):4 if len(set(i)) > 1:5 return ans6 ans += i[0]7 8 return ans9
例
strs=["flower","flgdcvghyf","fove"]for i in zip(*strs): print(i)>>('f','f','f')('l','l','o')('o','g','v')('w','d','e')
2018-07-22 11:18:24