Leetcode 最长公共前缀
最长公共前缀是一个非常典型的字符串问题,只要具备一定的字符串算法基础,就能很快地解决此问题。本文将从以下三个方面来讲解最长公共前缀问题:
- 算法思路
- 代码实现
- 时间复杂度分析
算法思路
最长公共前缀问题可以描述为:给定一个字符串数组,要求找到这些字符串的最长公共前缀。我们可以从第一个字符串开始,依次遍历所有字符串的相应位置,只要当前位置的字符相同,就继续向后遍历,否则直接返回当前位置之前的字符串,即为最长公共前缀。
例如,对于字符串数组["hello","hey","hepatic","helpful"],我们从第一个字符串"hello"开始遍历,发现第一个字符都是"h",则继续遍历。第二个字符也相同,则继续遍历。第三个字符发现不同,返回"he"即可,即为最长公共前缀。
代码实现
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
}
String commonPrefix = strs[0];
for (int i = 1; i < strs.length; i++) {
int j = 0;
while (j < commonPrefix.length() && j < strs[i].length() && commonPrefix.charAt(j) == strs[i].charAt(j)) {
j++;
}
commonPrefix = commonPrefix.substring(0, j);
if (commonPrefix.isEmpty()) {
return commonPrefix;
}
}
return commonPrefix;
}
时间复杂度
对于字符串数组中长度最短的字符串长度为m,字符串数组的长度为n,最长公共前缀长度为k,时间复杂度为O(m*n)。因为我们需要对所有字符串进行遍历操作,时间复杂度与字符串数组长度以及字符串长度有关。
结论
最长公共前缀问题看似简单,但是也存在一些坑点,如当字符串数组为空或者某个字符串为空字符串的情况。使用上面的代码实现能够轻松解决该问题,并且时间复杂度也比较优秀。
完整代码如下:
public class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
}
String commonPrefix = strs[0];
for (int i = 1; i < strs.length; i++) {
int j = 0;
while (j < commonPrefix.length() && j < strs[i].length() && commonPrefix.charAt(j) == strs[i].charAt(j)) {
j++;
}
commonPrefix = commonPrefix.substring(0, j);
if (commonPrefix.isEmpty()) {
return commonPrefix;
}
}
return commonPrefix;
}
}