题目:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z
。
解答:
1. 写了个分治解法:整个数组的公共前缀 = 对(左边一半的公共前缀 & 右边一半的公共前缀)求一次公共前缀。
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (strs.empty()) {
return "";
}
else if(strs.size() == 1) {
return strs[0];
}
else {
int half = strs.size() / 2;
vector<string> frontHalf(strs.begin(), strs.begin() + half);
vector<string> backHalf(strs.begin() + half, strs.end());
string front = longestCommonPrefix(frontHalf);
string back = longestCommonPrefix(backHalf);
string result = "";
for (int i = 0; i < min(front.length(), back.length()); i++) {
if (front[i] != back[i]) {
break;
}
result.append(1, front[i]);
}
return result;
}
}
};
2. 其实简单粗暴的扫描空间复杂度更低:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
int index = 0;
if (strs.empty()) {
return "";
}
for (int i = 0; i < strs[0].length(); i++) {
char current = strs[0][index];
// 对strs[0][i],strs[1][i],strs[2][i]进行比对
for (string str: strs) {
/* strs数组中有一个不存在第i个字符 或者 index处发生失配
(strs[0][index]与str数组中的其中一个字符串的第i位不相等
这里index一定等于i)*/
if (str.length() == i || current != str[index]) {
return str.substr(0, index);
}
}
index++;
}
//这里index一定到了最后面还要过去1个
return strs[0].substr(0, index);
}
};
3. 另一种扫描方式:可以求出前两个字符串的公共前缀,然后用这个前缀和后面的字符串再求一次公共前缀……一直做下去,直到遍历完整个数组:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (strs.empty()) {
return "";
}
if (strs.size() == 1) {
return strs[0];
}
string prefix = strs[0];
//更新prefix,即;令prefix与strs[1], strs[2] ... *strs.end()进行比对
for (int i = 1; i < strs.size(); i++) {
int lastIndex = min(prefix.length(), strs[i].length());
for (int j = 0; j < lastIndex; j++) {
if (prefix[j] != strs[i][j]) {
lastIndex = j;
break;
}
}
prefix = prefix.substr(0, lastIndex);
}
return prefix;
}
};