《LeetCode系列》---最长公共前缀

目录

一、题目描述

二、思路分析

代码分析:

第一种方法(通过startsWith方法)

第二种方法(横向扫描)


一、题目描述

题目名称: 最长公共前缀

难度:简单💥

通过题意,我们可以知道该题要求我们找一个字符串数组当中的公共前缀,然后返回该公共的字符串前缀部分。

二、思路分析

🎉这道题的解题思路很简单。

  • 由于此处是一个字符串数组,那我们可以对该数组进行遍历,设定一个起始的字符串ret=strs[0],让其和后续数组下标的字符串strs[i]进行比较,看是否存在公共前缀。
  • 要是存在再让起始的字符串替换为该公共前缀,再让这个公共前缀和后续的字符串进行比较,直到遍历结束,那这个字符串就为最后的公共前缀.

代码分析:

第一种方法(通过startsWith方法)

String类中有一种方法为:

startsWith(String prefix) 用来测试此字符串是否以指定的前缀开头。

我们可以利用这种方法来判断一个字符串是否为指定字符串中的前缀开头。 

但遍历刚开始,我们还无法确认前缀信息,只能一步步遍历查找。


代码示例:

以字符串数组{"flower","flow","flight"}为例

 要对比每一个字符串中的公共前缀。

String ret=strs[0];

首先将数组中第一个字符串设定为起始ret,用一个for循环(从第二个字符串开始循环,循环次数为数组元素长度-1)

for(int i=1;i<strs.length;i++){
}

要想比较出两个字符串中存在的公共部分,需要又用一个循环,对其起始字符串ret进行不断地修改截取。直到出现公共的部分,再将起始字符串修改为公共的字符串部分,之后继续和数组后续的字符串进行比较。

结束条件为:数组遍历结束ret被截取为长度为0的字符串

for(int i=1;i<strs.length;i++){
    while(!strs[i].startsWith(ret)){
            if(ret.length()==0){        //如果截取后为0,则说明没有找到公共部分
            return " ";
        }
        ret=ret.substring(0,ret.length()-1);    //截取ret字符串的减1个长度的部分
    }
}
return ret;

但这个代码还有一个地方没考虑到,就是字符串数组的合法性。

在leetcode提交的时候,需要考虑多方面中可能会出现的问题。

此处还需要考虑字符串数组的合法性:(1)字符串数组长度是否为0

                                                             (2)字符串数组是否为null

if(strs.length==0||strs==null){
    //数组长度为0,没有字符串
    return "";
}

运行结果:


 代码提交:

 


第二种方法(横向扫描)

🎉上面的一种方法,实际上字符串尾开始遍历截取查找公共前缀。

而此处的第二种方法,是从字符串头开始遍历查找公共前缀的部分。

💥实现思路和第一种方法差不多,也是一种横向扫描。 

以字符串数组的第一个字符串为起始比较,然后对后续的字符串数组元素遍历比较。

写一个方法来返回两个字符串比较后的公共前缀字符串部分。

字符串查找公共前缀的方法: 

(1)从字符串头部开始找的话,通过对传入的两个字符串的字符进行依次比较。比较的次数为两个字符串中长度小短的一个。

(2)写一个循环比较条件,两个字符串中从i为0位置的字符开始比较,如果满足两个字符相等,则继续向字符串中下一个下标字符进行比较,直到循环结束。 

public String stringReturn(String s1,String s2)    
    int length=Math.min(s1.length(),s2.length());    //通过Math类中的min方法拿到较小长度的
    int i=0;        //定义的这个i为下面循环结束后,公共前缀截至的位置。
    while(i<length&&s1.charAt(i)==s2.charAt(i)){
        i++;
    }
    //循环结束后,截取0到i位置的字符串,即为s1和s2字符串的公共前缀
    return s1.substring(0,i);
}

后续代码跟第一个代码差不多,只需在循环中调用该方法即可,循环结束返回公共前缀ret.

还需注意的是,找不到公共前缀的情况(即ret字符串长度为0)字符串数组的合法性

public String longestCommonPrefix(String[] strs) {
    if(strs.length==0||strs==null){
        return "";
    }
    String ret=strs[0];
    for(int i=1;i<strs.length;i++){
        if(ret.length()==0){
            return "";
        }
        ret=stringReturn(ret,strs[i]);
    }
    return ret;
}

代码示例:


 代码提交:

 

 

 

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星河栀染

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值