最长公共前缀

最长公共前缀

什么是最长公共前缀?

之前刷题的时候看见了这个题。
大意是这样的,给定一个字符串数组,求其最长公共前缀。

如:str[] = {“strings”,“string”,“straaa”,“strggg”};
这个数组的最长公共前缀就是"str",因为每一个字符串前面都有str。

再如:s[] = {“float”,“String”,“int”,“Double”};
这个数组的最长公共前缀就是"",因为他没有最长公共前缀,所以就是""。

本菜狗的第一想法就是 暴力(大雾)
当时就想着一轮又一轮的循环,把前面一样的暴力出来(不是
毕竟老根号三菜狗除了暴力啥也不会。
只会暴力的菜狗留下了没有技术的泪水。

我的解法

当然了,我当时无脑打了一会代码,就发现不能暴力,毕竟突然间有脑子了,欸,我也有脑子了。

那咋办呢?
要字典序排序,什么是字典序,就是字面意思,按照字典的方式进行排序,谜底就在谜面上。

就拿我给的第一个例子来说,用字典序拍完之后,他会变成
str[] = {“straaa”,“strggg”,“string”,“strings”};

那么我只需要比较最后一个和第一个的前缀就行了,我们就能知道这个到底有没有最长公共前缀。

给大家看一下主要的代码:

class Solution {
    public String longestCommonPrefix(String[] strs) {
        Arrays.sort(strs);
        //进行排序,这一排序就可以只比较第一个和最后一个就行
        String s=strs[0];
        //拿到第一个串
        while(!strs[strs.length-1].startsWith(s)){
        //用while循环检查,最后一个字符串跟第一个字符串是否相等
        //如果不相等,就把第一个字符串减去最后一个字符
        //直到把第一个字符串减成最长公共前缀,或者变成"",循环结束
        //输出s
            s=s.substring(0,s.length()-1);
        }return s;//返回公共前缀
    }
}

调用方法解释

如果看上面的代码能看懂的朋友就不用看这个了,这个是对上面调用方法的一种解释,怕大家像我一样菜狗,所以给大家解释一下具体什么意思。

startsWith()方法

什么是startsWith()方法,这个方法的意思就是用于检测字符串是否以指定的前缀开始。

        String str="菜狗的根号三";
        String str1="菜狗";
        System.out.println(str.startsWith(str1));

最后输出结果为true
表示str确实是以str1为前缀的,比如菜狗(哭

当然也可以通过指定位置来进行检测

        String str="菜狗的根号三";
        String str1="根号";
        System.out.println(str.startsWith(str1,3));

最后输出结果也为true,因为从下标为三的元素开始查询——根,进行查询。倘若从下标为四的地方开始查询的话那么返回的结果会是false。

而本题的解法就正是把第一个字符串当作了前缀进行比较。

substring()方法

啥又是substring()方法呢,substring() 方法是用来返回字符串的子字符串。

String substring(int beginIndex, int endIndex)

它有两个int参数,第一个是起始索引(包括),第二个是结束索引(不包括)

        String str="菜狗的根号三";
        String str1= str.substring(2,4);
        System.out.println(str1);

以这个为例,这个最后输出的是"的根",因为"的"的下标是2,而"根"的下标是3,所以输出的是"的根"。

回到我们这个题目上来,每一次循环得到的s都是上一次得到s的长度减一版,直至减到最小公共前缀或者减没。

总结

啊,又是菜狗的一天!
根号三参上

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值