0%

Leetcode 14 Longest Common Prefix

Write a function to find the longest common prefix string amongst an array of strings.

If there is no common prefix, return an empty string "".

Example 1:

1
2
Input: ["flower","flow","flight"]
Output: "fl"

Example 2:

1
2
3
Input: ["dog","racecar","car"]
Output: ""
Explanation: There is no common prefix among the input strings.

Note:

All given inputs are in lowercase letters a-z.

1 暴力

对strs的每个元素, 按位比较(这里的按位比较不是指位运算的那个位, 而是先比较第0个字符, 再比较第1个字符,..), 找到最长的前缀

复杂度mn, m是prefix的长度, n是strs的size

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
string ans = "";
if(strs.empty()) return ans;
for(int i = 0; i < strs.front().size(); ++i)
{
char chr = strs.front()[i];
bool isPrefix = true;
for(string str : strs)
{
if(i >= str.size() || str[i] != chr)
{
isPrefix = false;
break;
}
}
if(!isPrefix)
break;
else
ans.push_back(chr);
}
return ans;
}
};

2 利用set排序

这个答案是引用 leetcode.com,Author:[harsh_310] 的, 思路是把所有的str放入一个 tree-set中.

那么有字典序 set[0] < set[1] < set[2] < … < set[size - 1].

所以, 如果有 set[0] 和 set[size - 1] 有相同的某个最长前缀prefix, 那么根据字典序的关系, 所有的set元素的最长前缀也是prefix. 从而求出结果.

时间复杂度 nlogn, 空间复杂度n

这个方法和暴力算法没有优劣之分, 因为不能确定logn 和 m的大小, 同时空间复杂度也比暴力高

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
int n = strs.size();
if(n == 0)
return "";
if(n == 1)
return strs[0];
set<string> s;
for(auto i : strs)
s.insert(i);
if(s.size() == 1)
return *s.begin();
else{
string s1 = *s.begin();
string s2 = *(s.rbegin());
string temp = "";
int string_size = min(s1.size(),s2.size());
for(int i = 0; i < string_size;i++)
{
if(s1[i] != s2[i])
return s1.substr(0, i);
}
return s1.substr(0, string_size);
}
return "";
}
};