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<String>(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"}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值