题目描述
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""。
实例1:
输入:["flower","flow","flight"]
输出:"fl"
实例2:
输入:["dog","racecar","car"]
输出:""
解析:输入不存在公共前缀。
说明:
所有输入只包含小写的字母a-z
。
算法设计与分析:
-
java实现思路:
-
1、如果当前的字符串为空的时候,则最大公共的前缀为
nul
l,返回""
-
2、令最长公共前缀
pre
的值为第一个字符串,进行初始化 -
3、遍历后面的字符串,依次将其与pre进行比较,两两找出公共前缀,最终的结果即为最长的公共前缀
-
4、如果查找过程中出现pre为空的情况,则公共前缀不存在,直接返回
-
5、时间复杂度为:
O(s)
,s
为所有字符串的长度之和 -
java描述算法代码如下:
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length == 0)
return "";
String pre = strs[0];
for(int i=1;i<strs.length;i++){
int j = 0;
for(;j<pre.length() && j < strs[i].length();j++){
//使用到java的String的处理函数CharAt()
if(pre.charAt(j) != strs[i].charAt(j))
break;
}
// 每一轮截取一次,若到最后等于“”,就返回"",否则跳出循环继续,或者返回pre
pre = pre.substring(0, j);
if(pre.equals(""))
return pre;
}
return pre;
}
}
-python3实现思路:
- 注意:使用到里面的
zip()
函数,实现起来需要对python的函数,字符串的处理,切片式编程有要求。在这里先讲一下zip()函数
:
zip()函数描述:函数可以用于将可以迭代的对象作为参数,将对象中对应的元素打包成为一个个元组,然后返回这些元组组成的对象,这样做的好处是节约不少的内存。
然后我们可以使用list()转换来输出列表。
如果各个迭代器的元素个数不一致,则返回列表的长度与最短的对象相同,利用*号操作符,可以将元组解压为列表。
注意: zip方法在python2和python3中的不同,在python2中返回的是一个列表,在python3中返回的是一个对象。
例如1:
>>>a = [1,2,3]
>>>b = [4,5,6]
>>>c = [4,5,6,7,8]
>>>zipped = zip(a,b) # 压缩,返回的是一个对象
>>>zipped
<zip object at 0x103abc288>
>>>list(zipped) # list() 转换成为列表
[(1,4),(2,5),(3,6)]
list(zip(a,c)) # 元素的个数与最短的列表一致
[(1,4),(2,5),(3,6)]
a1,a2 = zip(zip(a,b)) # 与zip相反,zip()可以理解为解压,返回二维矩阵式
list(a1)
[1,2,3]
list(a2)
[4,5,6]
使用上面的zip函数可以对本题进行分析如下:
>>>strs = ["flower","flow","flight"] >>> z = zip(*strs) >>> z <zip object at 0x7f8d02bd11c8> >>> for item in z: ... print(item) ... ('f', 'f', 'f') ('l', 'l', 'l') ('o', 'o', 'i') ('w', 'w', 'g')
- 由上面的结果可知,其实对于传入的strs列表,其实就是一个已经压缩好的格式,虽然里面的元素是字符串,使用
zip(*xxx)
就可以将其解压,多余的尾部部分去掉。因此可以得到下面的伪代码分析: - 1、定义一个空的列表,用做存储每个字符串元素中相同位置是否相同的标志,
1
为相同,0
为不同。 - 2、循环遍历
zip(*strs)
解压出来的每一个元组,将每个元组转化成集合之后(集合中不允许存放相同的元素,使用集合可以去重),判断集合的长度是否为1
,如果为1
就说明元组的元素相同,就是原来strs
中每个元素的对应位置的媳妇相同,在ret
列表中添加1
,否则就添加0
。 - 3、计算列表
ret
中的0的个数,如果个数为0
,最后就添加一个0
作为切片截取的最后标志。 - 4、最后判断传入的
strs
是否为空,非空就使用切片截取返回,否则就返回""
。 - **注意:**可以两行代码搞定!代码真的简洁
- 使用Python3描述算法如下所示:
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
'''
# 代码真的简洁,
r = [len(set(c)) == 1 for c in zip(*strs)] + [0]
return strs[0][0:r.index(0)] if strs else ''
'''
ret = []
for item in zip(*strs):
if len(set(item)) == 1:
ret.append(1)
else:
ret.append(0)
if ret.count("0") == 0:
ret.append(0)
if strs:
return strs[0][:ret.index(0)]
else:
return ""