描述
给你一个大小为 n 的字符串数组 strs ,其中包含n个字符串 , 编写一个函数来查找字符串数组中的最长公共前缀,返回这个公共前缀。
输入:[“abca”,“abc”,“abca”,“abc”,“abcc”]
返回值:“abc”
解题思路
方法一:子串纵向查找
纵向遍历非常的直观,将每个字符串分别依次遍历每一列的元素,比较相同列上字符是否相同,若相同则比较下一个子串,若不同则最长公共前缀为上个遍历过的公共前缀。
复杂度分析:
时间复杂度:O(mn),其中n 是字符串的数量,m 是字符串数组中的字符串的平均长度。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次。
空间复杂度:O(1)。额外空间复杂度为常数。
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(!strs.size()) return "";
for(int i=0;i<strs[0].size();i++){//枚举第一个子串的每个字符
for(int j=1;j<strs.size();j++){//枚举后面所有的字串
if(strs[0][i]!=strs[j][i]||i==strs[j].size())//比较所有字串的第i列字符或者子串为i时
return strs[0].substr(0,i);
}
}
return strs[0];
}
};
方法二:排序后子串纵向查找
先将所以子字符串按照字典序的大小排序,想要得到最长公共前缀,只需要将字典序最小的子串A与字典序最大的B比较相同部分,得到的最长公共前缀就是所有子串的公共前缀。
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(!strs.size()) return "";
sort(strs.begin(),strs.end());
string a=strs.front(),b=strs.back();
int i=0;
for(i=0;i<strs.size() && a[i]==b[i];i++);
return a.substr(0,i);
}
};
复杂度分析:
时间复杂度:O(nlogn),其中n 是字符串的数量,排序算法时间复杂度O(nlogn)。
空间复杂度:O(1)。额外空间复杂度为常数。