[Lc]14最长公共前缀
Contents
题目
题解
1. 遍历法
- 时间复杂度$O(S)$(最坏情况)。S是所有字符数量。
- 空间复杂度$O(1)$
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {//两种方法。1.遍历法
//这道题纵向遍历,即比较字符串的每一个字符,挨个比较
if(strs.empty()) return "";
for(int j=0; j<strs[0].size(); j++){//外层遍历第几个字符
for(int i=0; i<strs.size(); i++){//内层遍历几个字符串
if(j >= strs[i].size() || strs[i][j] != strs[0][j]){//若字符数量超过第一个字符串长度,活着遍历到不同的字符
return strs[0].substr(0,j);//直接返回第一个字符串前j个字符
}
}
}
return strs[0];//若全部遍历完成还未停止,则返回第一个字符串
}
};
2. 排序法
- 时间复杂度$O(firstLen + endLen)$(最坏情况)。
- 空间复杂度$O(1)$
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {//两种方法。2. 排序比较首尾法
if(strs.empty()) return "";
sort(strs.begin(),strs.end());
int i = 0, len = min(strs[0].size(),strs.back().size());
while(i<len && strs[0][i] == strs.back()[i]) i++;
//直接比较首位的字符串,当字符数量超过短的字符串或者某个字符不相等时,返回前i个数,因为i为下标,所以取长度时要加1,最后一个++就是这个作用
return strs[0].substr(0,i);
}
};
Author ChrisHRZ
LastMod 2020-04-18