编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i]
仅由小写英文字母组成
c++class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (strs.empty()) // 处理空数组的情况
return "";
if (strs.size() == 1) // 处理只有一个字符串的情况
return strs[0];
int strs0Len = strs[0].length();
int strsLen = strs.size();
string s(strs0Len + 1, 'a');
int len = 0;
for (int i = 0; i < strs0Len; i++) {
int num = 0;
for (int j = 0; j < strsLen; j++) {
if (i >= strs[j].length() || strs[0][i] != strs[j][i]) { // 处理字符串长度不一致或者不相等的情况
len = i;
break;
}
num++;
}
if (num == strsLen) {
s[i] = strs[0][i];
len = i + 1; // 更新len
} else {
len = i;
break;
}
}
string str = s.substr(0, len);
return str;
}
};
注意
注意:当输入的字符串数组为空时,会导致 strs[0]
访问越界,引发错误。当输入的字符串数组为空时,会导致 strs[0]
访问越界,引发错误。当 'num' 等于 'strsLen' 时,虽然我们更新了 's' 中的字符,但是我们没有更新 'len'。在这种情况下,应该将 'len' 更新为 'i + 1'。
作者:力扣官方题解
来源:力扣(LeetCode)
用 表示字符串 的最长公共前缀。
可以得到以下结论:
基于该结论,可以得到一种查找字符串数组中的最长公共前缀的简单方法。依次遍历字符串数组中的每个字符串,对于每个遍历到的字符串,更新最长公共前缀,当遍历完所有的字符串以后,即可得到字符串数组中的最长公共前缀。
如果在尚未遍历完所有的字符串时,最长公共前缀已经是空串,则最长公共前缀一定是空串,因此不需要继续遍历剩下的字符串,直接返回空串即可。
c++class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (!strs.size()) {
return "";
}
string prefix = strs[0];
int count = strs.size();
for (int i = 1; i < count; ++i) {
prefix = longestCommonPrefix(prefix, strs[i]);
if (!prefix.size()) {
break;
}
}
return prefix;
}
string longestCommonPrefix(const string& str1, const string& str2) {
int length = min(str1.size(), str2.size());
int index = 0;
while (index < length && str1[index] == str2[index]) {
++index;
}
return str1.substr(0, index);
}
};
复杂度分析
时间复杂度:,其中 是字符串数组中的字符串的平均长度, 是字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次。
空间复杂度:。使用的额外空间复杂度为常数。
本文作者:古月流新
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!