leetCode-14: 最长公共前缀

题目描述:

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

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

示例1:

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

示例2:

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

解题思路:

当数组的长度大于1时,我们先拿到第一个和第二个元素的相同的前缀 prefix,此 prefix 也是一个字符串,然后再去下一个元素中匹配,看是否能够匹配到该字符串,如果完全匹配,则进行下一个元素的匹配;如果不能,则将 prefix 截掉最后一位继续进行匹配,直到匹配完所有的元素,将 prefix 返回即可。那么,对于 prefix 又该如何获取呢?开始时我们可以默认 prefix = str[0],然后去str[2] 中匹配,匹配方法如刚才所述,其实就是一个不断截取进行匹配的过程。代码如下:

// 如果数组为空,返回""
if (strs == null || strs.length == 0) {
    return "";
}
// 如果数组长度为1,则原样返回
if (strs.length == 1) {
    return strs[0];
}
// 默认最长公共前缀为数组中第一个元素
String prefix = strs[0];
for (String str : strs) {
    // 循环判断数组个元素是否以指定前缀 prefix 开头,如果不是,则将 prefix 截去最后一个字符,再进入循环
    while (!str.startsWith(prefix)) {
        prefix = prefix.substring(0, prefix.length() - 1);
    }
}
return prefix;

此方法的时间复杂度为O(n^2),程序执行时间很快,基本可以超过 LeetCode 100% 的提交用时。

还有一种方法,基于字典排序的方法。代码如下:

if (strs == null || strs.length == 0) {
    return "";
}
// 字典排序
Arrays.sort(strs);
System.out.println(new ArrayList(Arrays.asList(strs)));
// 取排序后第一个串
String prefix = strs[0];
// 取最后一个串与第一个串进行比较,取公共前缀
while (!strs[strs.length - 1].startsWith(prefix)) {
    prefix = prefix.substring(0, prefix.length() - 1);
}
return prefix;

字符串数组经过字典排序之后第一个和最后一个元素之间的差异最大,所以我们只需去获取第一个和最后一个元素的公共前缀即可。

字典排序:若原数组为:

{"12", "23456", "12345"}

经过字典排序之后为:

{"12", "12345", "23456"}

你可能感兴趣的:(#,LeetCode之简单题库,leetcode,最长公共前缀)