算法
(暴力枚举) $O(nm)$
暴力枚举方法很简单:先找到所有字符串的最短长度 m,然后从长度 1 到 m 依次枚举判断是否所有字符串的前缀是否都相等。
注意输入可能为空数组。
时间复杂度
最坏情况下,对于 n 个字符串,都需要遍历到最短长度,故总时间复杂度为 $O(nm)$。
空间复杂度
需要额外 $O(m)$ 的空间存储答案。
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (strs.empty()) return "";
string res;
int m = strs[0].size();
for (int i = 0; i < strs.size(); i ++)
if (strs[i].size() < m) m = strs[i].size();
for (int i = 0; i < m; i ++) {
char c = strs[0][i];
for (int j = 1; j < strs.size(); j ++)
if (strs[j][i] != c) return strs[0].substr(0, i); // substr()时间复杂度是O(logN)所以会增加时间复杂度
}
return strs[0].substr(0, m);
}
};
yxc代码
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
string res;
if (strs.empty()) return res;
for (int i = 0;; i ++ ) {
if (i >= strs[0].size()) return res;
char c = strs[0][i];
for (auto& str: strs) // 这里加上 &是为了不再复制一遍strs
if (str.size() <= i || str[i] != c)
return res;
res += c;
}
return res;
}
};