要求

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

原题:最长公共前缀

示例 1:

1
2
输入:strs = ["flower","flow","flight"]
输出:"fl"

示例 2:

1
2
3
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。

思路

如果只考虑只有两个字符串,找出他们的公共前缀

那么只需要使用 charAt() 方法来一个字符一个字符的比较,就可以得到他们的公共前缀(这里先不考虑特殊情况,假设存在公共前缀)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 此方法用于判断两个字符串的公共前缀
*
* @param str1
* @param str2
* @return
*/
private String getCommonPrefix(String str1, String str2) {
// 获取两个字符串的最短长度,防止循环时候出现下标越界
int minLength = Math.min(str1.length(), str2.length());
// 指定开始索引
int index = 0;
// 判断公共前缀
while (index < minLength && str1.charAt(index) == str2.charAt(index)) {
index++;
}
// 返回公共前缀
return str1.substring(0, index);
}

在得到了两个字符串的公共前缀后,我们可以将得到的公共前缀作为一个新的字符串,那么我们只需要拿这个字符串和下一个字符串继续进行比较,最后就可以得到所有字符串的公共字符串了

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class Solution {
public String longestCommonPrefix(String[] strs) {
// 先排除特殊情况
if (strs.length == 0 || strs == null) {
return "";
}
// 以 strs[0] 作为初始的公共前缀
String commonPrefix = strs[0];
// 遍历所有的字符串数组
for (int i = 1; i < strs.length; i++) {
// 两两比较后得到的新的公共前缀,赋值给commonPrefix
commonPrefix = getCommonPrefix(commonPrefix, strs[i]);

// 如果出现两个字符串没有公共前缀的话终止for循环
if (commonPrefix.length() == 0) {
break;
}
}
// 最后循环结束后得到的前缀就是所有字符串的最长公共前缀
return commonPrefix;
}

/**
* 此方法用于判断两个字符串的公共前缀
*
* @param str1
* @param str2
* @return
*/
private String getCommonPrefix(String str1, String str2) {
// 获取最短长度,防止下标越界
int minLength = Math.min(str1.length(), str2.length());
// 指定开始索引
int index = 0;
// 判断公共前缀
while (index < minLength && str1.charAt(index) == str2.charAt(index)) {
index++;
}
// 返回公共前缀
return str1.substring(0, index);
}
}

复杂度分析

时间复杂度:O(mn),其中 m 是字符串数组中的字符串的平均长度,n 是字符串数组中的字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次。

空间复杂度:O(1),使用的额外空间复杂度为常数。