力扣14.题目描述:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。
示例1 输入: ["flower","flow","flight"]
输出: "fl"
示例2 输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:所有输入只包含小写字母 a-z 。
那么,最近学习的python,所以想练习一下python,因此下面的都是python的解法
解法1思想是:首先求出所给字符串中的最小长度num,然后分别把每个字符串具有相同下标(0,1,2....num-1)的字母存到数组中,然后用set集合去除重复值,如果去除重复值之后的数组长度不为0那说明存在公共的字母,然后把这个字母放在数组dist中,然后开始下一轮循环;否则就说明不存在公共的字母,那么就结束了。
def longestCommonPrefix(strs):
if len(strs) == 0:
return ''
num = min([len(e) for e in strs])
print(num)
dst = []
for i in range(num):
cur = [e[i] for e in strs]
print(cur)
if len(set(cur)) == 1:
dst.append(cur[0])
else:
break
return ''.join(dst)
if __name__ == "__main__":
res = longestCommonPrefix(["dog","racecar","car"])
print(res)
解法2思想是:在python中,字符串是可以比较的,因此按照ASCII值我们只需要比较最大和最小字符串的公共前缀,得到的就是整个数组的公共前缀,这里用到了enumerate方法,那么enumerate()方法的说明如下:
对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值;enumerate多用于在for循环中得到计数。下面是个例子:
def longestCommonPrefix(strs):
if not strs: return ""
s1 = min(strs)
print(s1)
s2 = max(strs)
print(s2)
for i,x in enumerate(s1):
if x != s2[i]:
return s2[:i]
return s1
if __name__ == "__main__":
res = longestCommonPrefix(["dog","racecar","car"])
res = longestCommonPrefix(["flower","flow","flight"])
print(res)
解法3思想:利用python的zip函数,把str看成list然后把输入看成二维数组,左对齐纵向压缩,然后把每项利用集合去重,之后遍历list中找到元素长度大于1之前的就是公共前缀。那么其中有用到map的操作和zip,详情请参考此篇博客
那么这条语句ss = list(map(set, zip(*strs)))的运行结果如下图:
def longestCommonPrefix(strs):
if not strs: return ""
ss = list(map(set, zip(*strs)))
#print(ss)
res = ""
for i, x in enumerate(ss):
x = list(x)
if len(x) > 1:
break
res = res + x[0]
return res
if __name__ == "__main__":
res = longestCommonPrefix(["dog","racecar","car"])
res1 = longestCommonPrefix(["flower","flow","flight"])
print(res)
print(res1)
以上3种方法均可以解决这个问题,还需要多多练习!