A good beginning is half done.
01 | 👑 题目描述
给你一个字符串数组,请求出这字符串的最长公共前缀
求字符串数组的最长公共前缀,就是要找到这个字符串数组中所有字符串的共同的、以相同字符开头的最长前缀子串。
举个例子,假设字符串数组为 {"flower", "flow", "flight"}
,我们需要找到这三个字符串的最长公共前缀。
在这个例子中,字符串数组的最长公共前缀是 “fl”,因为它是这三个字符串共同的、以相同字符开头的最长前缀子串。
换句话说,最长公共前缀是指在一个字符串数组中,从索引0开始的、每个字符串都拥有的最长的共同前缀子串。它可以帮助我们识别出字符串数组中的共同特征或相似性。
02 | 🔋 解题思路
具体的解题流程:
-
首先,判断字符串数组是否为空或者长度为 0。如果是,直接返回空字符串作为最长公共前缀。
-
假设第一个字符串为参照字符串,将其作为初始的最长公共前缀。
-
遍历参照字符串的每个字符,依次与其他字符串相同位置上的字符进行比较。
-
如果在某个字符位置上存在不匹配的情况,或者已经达到了某个字符串的末尾,则停止比较。
-
更新最长公共前缀,只保留参照字符串中与当前位置相同的字符。
-
重复步骤 3-5,直到遍历完参照字符串的所有字符或者停止比较。
-
返回最终得到的最长公共前缀。
这种解题思路从第一个字符串开始逐个比较字符,通过不断缩小最长公共前缀的范围来找到所有字符串的最长公共前缀。注意,当字符串数组中有空字符串时,直接返回空字符串作为最长公共前缀。
- 时间 && 空间复杂度
- 时间复杂度:O(n * m),其中n是字符串数组的长度,m是字符串的平均长度
假设字符串数组的长度为n,其中每个字符串的平均长度为m。
在最坏情况下,需要遍历字符串数组中的每个字符串,并逐个比较字符 - 空间复杂度:O(1)
只使用了常数级别的额外空间来存储最长公共前缀和一些临时变量
- 时间复杂度:O(n * m),其中n是字符串数组的长度,m是字符串的平均长度
03 | 🧢 代码片段
#include <iostream>
#include <vector>
using namespace std;
string longestCommonPrefix(vector<string>& strs) {
if (strs.empty()) {
return "";
}
string prefix = strs[0]; // 将第一个字符串作为初始的最长公共前缀
for (int i = 1; i < strs.size(); i++) {
while (strs[i].find(prefix) != 0) { // 不断缩小最长公共前缀的范围,直到匹配前缀
prefix = prefix.substr(0, prefix.length() - 1);
if (prefix.empty()) {
return "";
}
}
}
return prefix;
}
int main() {
vector<string> strs = {"flower", "flow", "flight"};
string lcp = longestCommonPrefix(strs);
cout << "Longest Common Prefix: " << lcp << endl;
return 0;
}