14.最长公共前缀(Java)

一、题目

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

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

示例:

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

二、解题方法

方法一:横向比较

1.思路:

字符串两个两个的比较,比如先判断flower和flow得到flow,再将flow和flight比较得到fl

2.代码:

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs.length==0||strs==null){
            return "";//数组为空和数组长度为0的情况都没有公共前缀
        }
        String prefix=strs[0];
        int num=strs.length;//用变量num表示数组中字符串的个数
        for(int i=1;i<num;i++){
            prefix=longestCommonPrefix(prefix,strs[i]);//再定义一个函数比较每两个字符串中相同的前缀
        }
        return prefix;
    }

    public String longestCommonPrefix(String a,String b){
        int length=Math.min(a.length(),b.length());//利用Math.min()求出其中最小的
        int i=0;
        while(i<length&&a.charAt(i)==b.charAt(i)){
            i++;
        }
        return a.substring(0,i);
    }
}

3.补充

  • 数组为空和数组长度为0不一样,例如String[ ]a={ }不为空,但是其长度为0,因为{ }开辟了内存空间,再例如String[ ]b=null没开辟内存空间(即也没有给数组赋初值)则数组为空,没有数组长度。综上数组长度为0但数组不一定为空

  • 关于length后是否带括号,在处理字符串时需要加括号代表使用函数处理,用字符串.length( )表示,处理的是数字时,可不带括号,因为String类型内部带有length( )函数,这时可直接调用其属性,用数组.length表示

  • Java中substring(start,end)的使用,从start开始,返回从start到end的字符串,但是不包含end索引位置的字符

  • 在Java中定义函数,可以定义函数名相同,但是函数参数不同的函数,在C++中也可以,但是在C语言中不行

方法二:纵向比较

1.思路:依次比较每个字符串的每个字符

2.代码:

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs.length==0&&strs==null)
        return "";
        for(int i=0;i<strs[0].length();i++){//第一个for表示与数组中第一个字符串的各个字符比较
            char a=strs[0].charAt(i);
            for(int j=1;j<strs.length;j++){//第二个for表示比较数组中每个字符串
                if(i==strs[j].length()||a!=strs[j].charAt(i))//注意两个条件位置不能交换,否则会报错,出现String index out of range的错误,因为否则i==strs[j].length将未能及时对charAt(i)进行终止
                return strs[0].substring(0,i);
            }
        }
        return strs[0];
    }
}

3、补充:

  • substring(0,0)截取不到字符串,返回和“”的结果一样,即如果字符串中没有公共前缀则能正确返回

  • 一个更快的思路,可以先找到最短的字符串然后再比较


题目来源:力扣

解题思路参考:力扣官方题解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值