编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例1:
输入: ["flower","flow","flight"]
输出: "fl"
示例2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
这个题很有意思,我只想到了暴力法,而且我觉得在没有一些工具的情况下只能用暴力法。但是我一开始写的程序全是问题,最后通过的时候已经有接近40行代码了,这样的代码自己都觉得恶心,于是网上搜索了一下,思路都是一样的,但是人家的代码确实要比我的好很多。。。。。
这个程序的思路的话,就是遍历每一个字符串的每一个元素,遍历的方法有些不同,每次需要对所有的字符串的某一个位置的元素进行对比。所以干脆就拿出第一个字符串的元素对比就可以。另外还要注意的是需要判断字符串为空的情况。
C++源代码:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.empty()) return "";
for(int i=0;i<strs[0].size();++i){
for(int j=1;j<strs.size();++j){
if(strs[j][i]!=strs[0][i]) return strs[0].substr(0,i);
}
}
return strs[0];
}
};
对于python而言,有一个非常好用的工具叫做zip,zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
因此,zip可以自动把所有字符串的每个元素放到一起,而且可以选出最短的进行对齐。
python3源代码:
class Solution:
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
result = ''
for item in zip(*strs):
if len(set(item)) > 1:
return result
else:
result += item[0]
return result