题目
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明
所有输入只包含小写字母 a-z 。
解法一
暴力,先遍历字符串数组获取到其中最短字符串的长度(避免数组下标越界),第一层循环获取子串prefix,第二层遍历字符串数组,如果prefix不属于其中一个字符串的子串即上一层循环到的子串为最长公共子串。
- 时间复杂度:O(n * m)
- 空间复杂度:O(1)
class Solution {
public String longestCommonPrefix(String[] strs) {
String prefix = "";
if (strs.length > 0) {
// 获取字符串数组中最小的长度
int len = strs[0].length();
for (int i = 1; i < strs.length; i++) {
if (len > strs[i].length()) len = strs[i].length();
}
// 双层循环遍历出最长公共子串
for (int i = 0; i < len; i++) {
prefix = strs[0].substring(0, i + 1);
for (int j = 1; j < strs.length; j++) {
if (!prefix.equals(strs[j].substring(0, i + 1))) {
return prefix.substring(0, i);
}
}
}
}
return prefix;
}
}
解法二
二分查找。
- 时间复杂度:O(n * log(m))
- 空间复杂度:O(1)
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
}
// 获取字符串数组中最短字符串的长度
int min = strs[0].length();
for (int i = 1; i < strs.length; i++) {
if (min > strs[i].length()) {
min = strs[i].length();
}
}
// 二分查找最长公共前缀
int lo = 1;
int hi = min;
while (lo <= hi) {
int mid = (hi + lo) / 2;
if (isCommonPrefix(strs, mid)) {
lo = mid + 1;
} else {
hi = mid - 1;
}
}
return strs[0].substring(0, (lo + hi) / 2);
}
// 循环遍历字符串数组,判断是否为公共前缀
private boolean isCommonPrefix(String[] strs, int len) {
String str = strs[0].substring(0, len);
for (int i = 1; i < strs.length; i++) {
if (!strs[i].startsWith(str)) {
return false;
}
}
return true;
}
}