算法题Day4-最大公共前缀

本文深入探讨了如何寻找字符串数组中的最长公共前缀问题,提供了两种实现方案:一种是基于JavaScript的复杂实现,另一种是简洁的Java版本。通过实例演示了算法的运行过程,适合初学者理解和实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

示例 1:

输入: ["flower","flow","flight"]
输出: "fl"
示例 2:

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

说明:

所有输入只包含小写字母 a-z


嗯开始一看是啊挺简单的
最开始我只想到了判断数组第一个字符串的第一个字母和后面元素的第一个字母是否一样

但是我最后没做出来,于是我就想用两个for循环做
打扰了还是没做出来
于是我开始想要不继续在第一种思路上改改吧

于是有了如下一坨代码
以数组的第一个元素作为参照
但其实我觉得用最短的作为参照会更好一点儿
这坨代码已经通过了leetcode的编译
但就是太长了好啰嗦

function FindSameFront(str) {
    if(typeof(str[0]) == "undefined"){//如果是个空数组,也直接结束
      return "";
    }
    ------------------
    var FirstStr = str[0], i = 1, I = 0, data = [str.length],MinLength=FirstStr.length,f;
    for(f=1;f<str.length;f++){//找到最短的元素
      if(MinLength>str[f].length){
        MinLength=str[f].length;
      }
    }
    -----------------------------
    for(var g=0;g<str.length;g++) {//如果有元素为空就返回空
      if (str[g] === "") {
        return "";
      }
    }
    ----------------------
    if (str.length === 1) {//如果只有一个元素,返回自己
      return str[0];
    } else{
      while (str[i]) {
        var temp = str[i], a = 0;//如果当前相等的a就为
        while (FirstStr[a] === temp[a] && a < FirstStr.length && a < MinLength) a++;//只要第一个字符串和后面字符串有对应元素相等就继续比较
        if (a === 0) {//只要有a=0就结束
          return '';
        }
        data[I] = a; I++;i++;
      }//while
      data.sort();
    return str[0].substring(0,data[0]);
    }
  }

主要就是如果有匹配到相同的字母
就继续判断这个字符串中后面的字母
等到没有相同的以后就把他们匹配到的下标放在数组中
在判断中,如果有值为0说明没有的前缀

所以最后把数组排序
那么数组中最小的那个数
就是它要截取的长度

 while (FirstStr[a] === temp[a] && a < FirstStr.length && a < MinLength) 

a必须要小于参照字符串的长度
和最小的字符串的长度


还有一种简单的java版本

public String longestCommonPrefix(String[] strs) {
        if(strs == null || strs.length == 0 ){
            return "";
        }//如果是空数组或者是空串直接结束
        int max  = 0;
        for(int i = 0;i<strs[0].length() ;i++){//用第一个元素的长度控制循环
            char ch = strs[0].charAt(i);
            for(String s : strs){
                if(i>=s.length() || s.charAt(i) != ch){
                    return strs[0].substring(0,max);
                }
            }
            max++;
        }   
        return strs[0].substring(0,max);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值