LeetCode 14. Longest Common Prefix
2020-05-30 08:10:25 # leetcode

Problem

LeetCode 14. Longest Common Prefix

1. 题目简述

给出一组字符串,找出这些字符串的最长common前缀。

2. 算法思路

水平比较

首先,最容易想到的思路就是从前往后,一个个进行比较找common suffix,直到找到最后一个字符串。

这种方法时间复杂度为O(S),S是所有字符串的字符数总和,最坏情况就是所有字符串相等,一直比较下去。

垂直比较

垂直的意思是从第一位开始比较,比较所有的字符串的第一位,如果相同,则比较下一位;如果不同或者到达某字符串的最大长度,则返回当前的suffix。

这种方法时间复杂度为O(S),S是所有字符串的字符数总和,最坏情况就是所有字符串相等,一直比较下去。

分治法

可以将原本的数组不断拆分成子数组,然后获取子数组的最长公共前缀,然后再进行合并。

时间复杂度为O(S),空间复杂度为O(m * logn)。空间复杂度是因为我们需要调用函数logn词,每次空间为m。

3. 解法

水平比较

1
2
3
4
5
6
7
8
9
10
11
12
13

public class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs.length == 0) return "";
String prefix = strs[0];
for (int i = 1; i < strs.length; i++)
while (strs[i].indexOf(prefix) != 0) {
prefix = prefix.substring(0, prefix.length() - 1);
if (prefix.isEmpty()) return "";
}
return prefix;
}
}

垂直比较

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) return "";
for (int i = 0; i < strs[0].length() ; i++){
char c = strs[0].charAt(i);
for (int j = 1; j < strs.length; j ++) {
if (i == strs[j].length() || strs[j].charAt(i) != c)
return strs[0].substring(0, i);
}
}
return strs[0];
}
}

分治法

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
class Soluton{
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) return "";
return longestCommonPrefix(strs, 0 , strs.length - 1);
}

private String longestCommonPrefix(String[] strs, int l, int r) {
if (l == r) {
return strs[l];
}
else {
int mid = (l + r)/2;
String lcpLeft = longestCommonPrefix(strs, l , mid);
String lcpRight = longestCommonPrefix(strs, mid + 1,r);
return commonPrefix(lcpLeft, lcpRight);
}
}

String commonPrefix(String left,String right) {
int min = Math.min(left.length(), right.length());
for (int i = 0; i < min; i++) {
if ( left.charAt(i) != right.charAt(i) )
return left.substring(0, i);
}
return left.substring(0, min);
}
}