题目
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”
示例 2:
输入:strs = [“dog”,“racecar”,“car”]
输出:""
解释:输入不存在公共前缀。
- 方法一:纵向扫描
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.empty()) return "";
//依次比较每个字符串第index个字符,如果不同则返回strs[0]长度为index的子串
for(int index = 0; index<strs[0].size(); ++index){
for(int i=1; i<strs.size(); i++){
if(strs[i][index]!=strs[0][index])
return strs[0].substr(0,index);
}
}
return strs[0];
}
};
-
时间复杂度O(n1+n2+…)
-
空间复杂度O(1)
-
思路
- 以第一行的向量为基准,一次比较二维向量的每一列的字符是否相同,如果不同则返回第一行字符中当前比较字符前的字符串,如果第一行所有字符的列扫描完全部相同则返回第一行字符。
-
方法二:横向扫描
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.empty()) return "";
int right_most = strs[0].size()-1;//记录当前最长前缀的最后一个字符的下标
//横向扫描,依次计算每个字符串和第一个字符串公共前缀的最后一个下标
for(int i = 1; i<strs.size(); i++){
for(int j=0; j<=right_most; j++){
if(strs[i][j]!= strs[0][j]){
right_most = j-1;//当前字符不匹配,则最长公共前缀为它的前一个字符
}
}
}
return strs[0].substr(0, right_most+1);//返回strs[0]从第一个字符开始right_most+1个字符
}
};
- 时间复杂度O(n1+n2+…)
- 空间复杂度O(1)
- 思路
- 每个字符串与第0个字符串比较,记录他们最长前缀的下标,如何第0个字符串依次与下一个字符串比较,直到所有字符串比较完。返回此时第0个字符串下标前的字符。