编辑
2024-03-05
LeetCode
00
请注意,本文编写于 411 天前,最后修改于 411 天前,其中某些信息可能已经过时。

目录

最长公共前缀
题解:横向扫描

最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

示例 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'。

题解:横向扫描

作者:力扣官方题解

链接:https://leetcode.cn/problems/longest-common-prefix/solutions/288575/zui-chang-gong-gong-qian-zhui-by-leetcode-solution/

来源:力扣(LeetCode)

LCP(S1Sn)LCP(S_1…S_n)表示字符串 S1SnS_1…S_n的最长公共前缀。

可以得到以下结论:

LCP(S1Sn)=LCP(LCP(LCP(S1,S2),S3),Sn)LCP(S_1…S_n)=LCP(LCP(LCP(S_1,S_2),S_3),…S_n)

基于该结论,可以得到一种查找字符串数组中的最长公共前缀的简单方法。依次遍历字符串数组中的每个字符串,对于每个遍历到的字符串,更新最长公共前缀,当遍历完所有的字符串以后,即可得到字符串数组中的最长公共前缀。

如果在尚未遍历完所有的字符串时,最长公共前缀已经是空串,则最长公共前缀一定是空串,因此不需要继续遍历剩下的字符串,直接返回空串即可。

最长公共前缀(题解)

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); } };

复杂度分析

时间复杂度:O(mn)O(mn),其中 mm 是字符串数组中的字符串的平均长度,nn 是字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次。

空间复杂度:O(1)O(1)。使用的额外空间复杂度为常数。

本文作者:古月流新

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!