14. 最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
解题思路
横向搜索
时间O(m*n)
空间O(1)
class Solution {
public:
int getMinLength(vector<string>& strs)
{
int minLength = strs[0].size();
for(int i=0; i<strs.size(); ++i)
if(minLength>strs[i].size())
minLength = strs[i].size();
return minLength;
}
string longestCommonPrefix(vector<string>& strs) {
if(strs.size()==0)
return "";
int minLength = getMinLength(strs);
string ans = "";
for(int i=0; i<minLength; ++i){
for(int j=1; j<strs.size(); ++j){
// cout << strs[0][i] << " "<<strs[j][i]<<"\n";
if(strs[j][i]!=strs[0][i])
return ans;
}
ans += strs[0][i];
}
return ans;
}
};
执行用时:8 ms, 在所有 C++ 提交中击败了38.64% 的用户
内存消耗:7 MB, 在所有 C++ 提交中击败了37.37% 的用户
二分查找
时间O(mnlogm)
空间O(1)
class Solution {
public:
//在位置t是否具有相等字符
bool isEqual(vector<string>& strs, int t)
{
for(int i=1; i<strs.size(); ++i){
for(int j=0; j<=t; ++j)
if(strs[0][j]!=strs[i][j])
return false;
}
return true;
}
int getMinsize(vector<string>& strs)
{
int minSize = strs[0].size();
for(int i=1; i<strs.size(); ++i){
if(strs[i].size()<minSize)
minSize = strs[i].size();
}
return minSize;
}
string longestCommonPrefix(vector<string>& strs) {
if(strs.size()==0)
return "";
int minSize = getMinsize(strs);
int left = 0;
int right = minSize-1;
while(left<=right){
int mid = left + ((right-left)>>1);
if(isEqual(strs,mid)){
left = mid + 1;
}
else {
right = mid - 1;
}
}
return strs[0].substr(0,left);
}
};
执行用时:8 ms, 在所有 C++ 提交中击败了38.64% 的用户
内存消耗:6.8 MB, 在所有 C++ 提交中击败了64.30% 的用户