最长公共前缀
难度:
标签:
题目描述
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入:strs = ["flower","flow","flight"] 输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"] 输出:"" 解释:输入不存在公共前缀。
提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i]
仅由小写英文字母组成
代码结果
运行时间: 48 ms, 内存: 15 MB
/*
* 思路:
* 1. 使用Java Stream的简洁语法来实现最长公共前缀的查找。
* 2. 取第一个字符串为基准,使用Stream的特性进行匹配。
* 3. 对于每个字符,使用allMatch方法检查所有字符串是否以当前前缀开头。
* 4. 通过substring不断缩短前缀,直到找到最长公共前缀。
*/
import java.util.Arrays;
public class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) return "";
String prefix = strs[0];
for (int i = 0; i < prefix.length(); i++) {
String currentPrefix = prefix.substring(0, i + 1);
boolean allMatch = Arrays.stream(strs).allMatch(s -> s.startsWith(currentPrefix));
if (!allMatch) {
return prefix.substring(0, i);
}
}
return prefix;
}
}
解释
方法:
此题解采用了二分搜索的方法来寻找最长公共前缀。首先,通过计算所有字符串的最小长度来确定搜索范围,然后使用二分搜索来逐渐缩小可能的公共前缀的长度范围。在每次搜索过程中,都会检查当前中间长度是否为所有字符串的公共前缀,如果是,则尝试增加长度,否则减少长度。这种方法依赖于二分搜索逐步缩小搜索空间,并且在每次迭代中都通过比较切片来检查公共前缀。
时间复杂度:
O(m * n * log(m))
空间复杂度:
O(m)
代码细节讲解
🦆
在实现二分查找的时候,为什么选择使用`minLength`作为上限进行查找?是否有可能最长公共前缀的长度超过某个字符串的长度?
▷🦆
函数`isCommonPrefix`中的比较是基于什么逻辑来确定所有字符串在该长度上具有共同前缀的?
▷🦆
在二分查找中,调整`mid`值时,为什么将`high`设置为`mid - 1`而不是`mid`?
▷🦆
你是如何考虑和处理输入数组为空的情况?
▷🦆
能否详细解释算法中的时间复杂度`O(m * n * log(minLength))`是如何计算得出的?
▷🦆
在二分查找中,更新`low`和`high`指针的策略会如何影响算法的执行效率?
▷