LeetCode14:最长公共前缀

题目:

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

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

示例 1:

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

示例 2:

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

说明:

所有输入只包含小写字母 a-z 。

解析:

参考了官方分析的方法一,水平分析法。

思路

首先,我们将描述一种查找一组字符串的最长公共前缀 LCP(S_1 \ldots S_n) 的简单方法。 我们将会用到这样的结论:

LCP(S_1 \ldots S_n) = LCP(LCP(LCP(S_1, S_2),S_3),\ldots S_n)

算法

为了运用这种思想,算法要依次遍历字符串[S_1 \ldots S_n],当遍历到第 i 个字符串的时候,找到最长公共前缀 LCP(S_1 \ldots S_i)。当 LCP(S_1 \ldots S_i)是一个空串的时候,算法就结束了。 否则,在执行了 n 次遍历之后,算法就会返回最终答案 LCP(S_1 \ldots S_n)

 详细解释:

用示例1举例。先把定义最长前缀prefix为字符串数组的第一个字符串strs[0],在for循环中找最长前缀,这里用到java的indexOf函数,这个函数有种用法是s1.indexOf(s2),意思是如果字符串字符串s1包含s2则返回s1和s2共同相交的开始下标位置,如果s1中找不到s2,则返回-1。另外,还需要另一个方法substring(int beginIndex, int endIndex),需要注意的是endIndex位置取不到,我们也正是利用这个方法不断的对从后往前字符串缩小来找最长前缀。我们使用while循环来判断是否存在前缀,即while(strs[i].indexOf(prefix) != 0),因为前缀肯定是从第一个位置开始的嘛,所以下标是0,如果不等于0,那么我们就使用substring()方法来不断从后减小prefix,直到满足条件。当然,如果找不到的话,prefix减小到为空了,按题目要求返回“”。

假如prefix=strs[0],即prefix为“flower”,for循环下标当然要从1开始了,那么strs[1]就是flow咯。当while(strs[i].indexOf(prefix) != 0),肯定找不到下标位置嘛,flow都比flower短怎么包含怎么找呢。因此,prefix = prefix.substring(0, prefix.length() - 1),prefix就缩短为flowe了,然后这样一直在while循环中判断,直到找到前缀的下标。好了,到这我们假设找到了第一个字符串strs[0](prefix)和第二个字符串的最长前缀(暂定用prefix1代替,方便下面说明),然后因为在for循环中,i++,我们在拿刚才得到的结果prefix1和strs[2]计算得到最长前缀prefix2,这样依次下去直到最后一个字符串,也就是上面提到的这个思路LCP(S_1 \ldots S_n) = LCP(LCP(LCP(S_1, S_2),S_3),\ldots S_n)。至此,我们可以写代码,如下:

代码:

public String longestCommonPrefix(String[] strs) {
    if(strs == null || strs.length == 0)
        return "";
    String prefix = strs[0];
    for(int i = 1; i < strs.length; i++){
        while(strs[i].indexOf(prefix) != 0){
            prefix = prefix.substring(0, prefix.length() - 1); //endIndex取不到,每次while循环从后往前减小prefix
        }
        if(prefix.isEmpty())
            return "";
    }
    return prefix;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值