leetcode(7).14. Longest Common Prefix

题意:找字符串数组的公共前缀字符串

参数:string[]  返回  string

思路:不断遍历循环所有的string,一位一位的比较,直到有不同为止,但是这样比不方便,所以,第一个string不参与循环,其他n-1个string循环,和第一个string的每一位比较。(string需要用toCharArray()变成字符数组)但是这种思路太复杂,显然是不好的,循环里面每个都还要比,实现起来是麻烦的。

然后就在纸上画:反推,假设公共子串是abc

那么比如:
a b c x y z

a b c d

a b c c c

a b c

a b c d d d t

我们来思考所谓最长前缀子串,分析它的充分必要的特征可以看出:从串的第一个开始,所有都有相同的部分,如果不是所有串那么可能会有更长的相同子串。比如上面只比较第二个和第五个就是a b c d。所以,我们继续思考,对于最长公共子串后面那一位,可能没有,可能有些相同(但是一定不是所有都相同),有些不同。所以比如是 x,d,c,' ',d这几个,先不用怎么分析,继续再列出极端临界情况:只有一个不同,其它都相同:c d d d d 或者全都不同a b c d e或者全为空。

好,现在来分析:关键在于可能会有相同的字母,但是不可能全=>存在不同  不严谨的描述最长公共子串后面那一位最核心的点就是:存在不同。

那么,接下来,怎么发现存在不同呢?我们只需要比较最大的和最小的就可以了!所以我们考虑对字符串排序。我们就可以只比较两个串!


public class Solution {
    public String longestCommonPrefix(String[] strs) {
         if (strs == null || strs.length == 0)
            return "";
        
        Arrays.sort(strs);
        char[] min = strs[0].toCharArray();
        char[] max  = strs[strs.length - 1].toCharArray();
        
        int i = 0;
        while(i < min.length && min[i] == max[i]) 
            i++;
        return strs[0].substring(0,i);
    }
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值