【LeetCode-字符串】最长公共前缀
题目描述
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例
输入: ["flower","flow","flight"]
输出: "fl"
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
题目链接: https://leetcode-cn.com/problems/longest-common-prefix/
思路1
首先找到最短的字符串,然后遍历最短的字符串,将当前位和其余字符串作比较:如果其余字符串的当前位和最短字符串的当前位全部相等,则比较下一位;如果有一个不相等,则循环终止,从字符串开始位置到当前位置的前一位就是最长的公共前缀(其实不需要根据最短字符串进行比较,随便找一个字符串作为基准比较就行了)。代码如下:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.empty()) return "";
int shortest = 0x7fffffff;
string shortestStr = "";
for(int i=0; i<strs.size(); i++){
if(strs[i].length()<shortest){
shortest = strs[i].length();
shortestStr = strs[i];
}
}
int i=0;
while(i<shortest){
bool breakFlag = false;
for(int j=0; j<strs.size(); j++){
if(strs[j][i]!=shortestStr[i]){
breakFlag = true;
break;
}
}
if(breakFlag) break;
i++;
}
return shortestStr.substr(0,i);
}
};
- 时间复杂度:O(n)
n是字符串数组的长度。最坏情况下为O(n*m),其中m是最短字符串的长度。 - 空间复杂度:O(1)
思路2
首先选择一个字符串当做目前的前缀,不妨选第一个,然后判断目前的前缀是否是第二个字符串的前缀:如果不是,则将当前的前缀最后一个字符去掉,如果去掉后当前前缀为空,则直接返回;如果去掉后不为空且是第二个字符串的前缀;那么继续通过同样的方法比较第三个字符串,直至比较一遍或者前缀为空,如果比较结束后,当前前缀不为空,则当前前缀就是最长的公共前缀。代码如下:
class Solution {
public:
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不是strs[i]的前缀
prefix.pop_back(); // 删除prefix的最后一个字符
if(prefix.empty()) return prefix;
}
}
return prefix;
}
};
- 时间复杂度:O(n)
n为字符串数组的长度。 - 空间复杂度:O(1)