编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
#include <iostream>
#include <vector>
#include <string>using namespace std;string longestCommonPrefix(vector<string>& strs) {if (strs.empty()) return ""; // 如果输入为空,则返回空字符串string prefix = strs[0]; // 将第一个字符串作为初始公共前缀for (int i = 1; i < strs.size(); ++i) {// 逐个比较当前字符串和公共前缀的字符,更新公共前缀int j = 0;while (j < prefix.size() && j < strs[i].size() && prefix[j] == strs[i][j]) {++j;}prefix = prefix.substr(0, j); // 截取当前公共前缀if (prefix.empty()) break; // 如果公共前缀为空,则直接退出循环}return prefix;
}int main() {vector<string> strs = {"flower", "flow", "flight"};cout << "Longest common prefix: " << longestCommonPrefix(strs) << endl;return 0;
}
时间复杂度分析
字符串数组中字符串的平均长度:设字符串数组中共有 n 个字符串,每个字符串的平均长度为 m。在最坏情况下,需要比较每个字符串的每个字符,因此时间复杂度为 O(n * m)。
字符串数组的大小:设字符串数组中共有 n 个字符串。在最坏情况下,需要比较每个字符串的所有字符。因此,时间复杂度也可以表示为 O(S),其中 S 是所有字符串的总长度。
分拣复杂度分析
主要取决于存储最长公共前缀的额外空间和其他变量的空间开销:
最长公共前缀的空间复杂度为 O(1),因为我们只使用了常数个额外变量来存储结果。
其他变量的空间开销也是常数级的,不随输入规模变化。
因此,该算法的空间复杂度为 O(1),是一个常数级的空间复杂度。