力扣算法题14:最长公共前缀

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

1. 首先看题目要求:

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

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

示例 1:

输入:strs = [“flower”,“flow”,“flight”] 输出:“fl” 示例 2:

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

2. 看看解题思路:

    // 思路:
    // 如果存在公共前缀,则返回该最长前缀。那么依据短板效应,我们可以找出最短的,从最短开始下手比较
    // 若不存在,则说明没有公共前缀,返回空字符串。那么首先排除空字符串的情况

    //先思考一下有几种特殊情况:
	// 1、字符串数组为null,结果就返回空
	// 2、字符串数组只有单个字符,只需要返回这个值就行

3. 接下来是代码:

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if (strs == null || strs.length == 0){
            return "";
        }
        // 定义一个length
        // java中并不支持多维数组,但它允许一维数组作为另一个一维数组的元素,以此来达成多维数组的功能
        // strs.length指二维数组strs的行数,strs[0].length指第一行中元素的个数,strs[n].length指第n行中元素的个数
        int length = strs[0].length();
        // 定义一个strCount来接收数组的长度
        int strCount = strs.length;
        // 开始遍历字符串数组
        for (int i = 0; i < length; i++) {
            // 拿到字符串数组中的第一个元素,同其他字符串进行再次for循环比较
            char c = strs[0].charAt(i);
            for (int j = 0; j < strCount; j++) {
                // 考虑找不到最长公共前缀的两种情形
                if (i >= strs[j].length() || strs[j].charAt(i) != c) {
                    return strs[0].substring(0,i);
                }
            }
        }
        // 如果字符串数组只有一个字符串时
        return strs[0];
    } }

在这里插入图片描述

  • 上面这个方法是从第一行元素开始遍历的,如果第一行元素很长,那么耗时就会久,时间复杂度需要高,所以需要换个思路
  • 首先我们要找到数组中最小的一个字符串,依据短板效应,最短的数组往往可以很轻松地获取到公共前缀。猜想:极端情况下,最短字符串可能就是最长公共前缀
  • 于是我们可以遍历数组的字符串,看看是不是从这个最小字符串开始的,String有个方法可以解决这个问题,即为startsWith方法
  • 一直到我们找到不相同字符时,就可以截取字符串了,截取之前的,那必定是最长公共前缀
  • 两张返回情况:①遍历完数组返回最小字符串;②最小字符串被截取完了,返回null

直接上代码

class Solution {
    public String longestCommonPrefix(String[] strs) {
        // 字符串为空,直接返回空字符串
        if(strs.length == 0) {
            return "";
        };
        // 调用获取最小长度方法
        String s = findMinLen(strs);
        // 开始遍历字符串数组
        for(String string : strs) {
            // 如果这个字符串不是以最小字符串开头的,直接返回空字符串
            while(!string.startsWith(s)){
                if(s.length() == 0) return "";
                // 截取最小字符串,最小字符串长度 -1
                s = s.substring(0,s.length() - 1 );
            }
        }
        // 返回最长公共前缀
        return s;
    }

    public String findMinLen(String[] strs) {
        // 首先定义最小字符串就是第一个字符串数组
        String minStr = strs[0];
        // 开始遍历
        for(String string : strs) {
            // 如果其他的字符串数组的长度小于最小字符串的长度
            if(string.length() < minStr.length()){
                // 将最小字符串数组赋值
                minStr = string;
            }
        }
        //返回最小字符串
        return minStr;
    }
}

结果还行,O(n)
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值