
第四题、#14. 最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入: [“flower”,“flow”,“flight”]
输出: “fl”
示例 2:
输入: [“dog”,“racecar”,“car”]
输出: “”
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-common-prefix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
纵向比较法:时间复杂度:O(mn),其中 m是字符串数组中的字符串的平均长度,n是字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次。空间复杂度:O(1)。使用的额外空间复杂度为常数。
遍历第一个字符串的所有字符,并与之后的每个字符串的相应位置比较判断返回最长的结果
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (!strs.size()) return ""; //如果该数组为空则直接返回
int strs_size = strs.size(); //总共的字符串数量
int count = strs[0].size(); //第一个字符串的长度
for(int i = 0; i < count;i++){ //遍历比较第一个字符串的每个字母
char c = strs[0][i]; //取出其中的一个字符
for(int j = 1; j < strs_size; j++){ //和每一个字符串的首个字符相比较
if(i == strs[j].size() || strs[j][i] != c) //要比较的字符串长度不够或者该位置不相等
return strs[0].substr(0, i); //返回从0 到i-1个相同的字符
}
}
return strs[0]; //返回该字符串即可
}
};
迭代法求解: 取出第一个字符串 ,然后遍历剩余的字符串,两两求最长公共前缀
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(!strs.size()) return "";
int strs_size = strs.size();
string pre = strs[0];
for(int i = 1; i < strs_size; i++){
pre = longestCommonPrefix(pre , strs[i]);
if(!pre.size())
return "";
}
return pre;
}
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);
}
};
本文深入探讨了如何寻找字符串数组中的最长公共前缀问题,提供了两种有效算法:纵向比较法和迭代法。通过示例详细讲解了每种方法的实现步骤及代码,帮助读者理解并掌握这一常见算法题。
385

被折叠的 条评论
为什么被折叠?



