链接:https://leetcode-cn.com/problems/longest-common-prefix/
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
std::string result;
if (strs.empty()) {
return std::move(result);
}
// 拿第一个字符串做对比
std::string prefix = strs[0];
for (int i = 0; i < prefix.size(); ++i) {
for (int j = 1; j < strs.size(); ++j) {
// 比较第一个字符串的每个位置,与后续每一个字符串位置字符是否相等
if ((i == strs[j].size()) || (prefix[i] != strs[j][i])) {
return prefix.substr(0,i);
}
}
}
return prefix;
}
};
复杂度分析
时间复杂度:O(S),S 是所有字符串中字符数量的总和。
最坏情况下,输入数据为 n 个长度为 m的相同字符串,算法会进行 S=m∗n 次比较。可以看到最坏情况下,本算法的效率与算法一相同,但是最好的情况下,算法只需要进行 n*minLenn 次比较,其中 minLen是数组中最短字符串的长度。
空间复杂度:O(1),我们只需要使用常数级别的额外空间。
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.empty()) {
return "";
}
int len = strs[0].size();
if(len <= 0) {
return "";
}
if(strs.size() == 1) {
return strs[0];
}
int cur_index = 0;
int max_index = INT_MAX;
if(strs.size() >= 2) {
for (cur_index = 0; cur_index < len; ++cur_index) {
bool flag = true;
for(int i = 1; i < strs.size(); ++i) {
if(cur_index+1 <= strs[i].size() && strs[0][cur_index] == strs[i][cur_index]) {
continue;
} else {
flag = false;
break;
}
}
if(flag) {
max_index = cur_index;
} else {
break;
}
}
}
if(max_index != INT_MAX) {
return strs[0].substr(0, max_index+1);
} else {
return "";
}
}
};