LeetCode最长公共前缀 | 算法练习系列

288 阅读1分钟

这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战

前言

已经连着几天更新js算法题了,好多都和字符串相关,这让我更加意识到对字符串的处理在js中是何等的重要,今天仍然是一道字符串相关的题目,最长公共前缀。下面给出我的做题思路

题目描述

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

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

示例 1:

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

输出:"fl"

示例 2:

输入:strs = ["dog","racecar","car"]

输出:""

解释:输入不存在公共前缀。  

提示:

1 <= strs.length <= 200

0 <= strs[i].length <= 200

strs[i] 仅由小写英文字母组成

解题思路

  • 这道算法题乍一看,题目描述这么短,应该很简单吧,至少我看到题目是这么想的,但事实并不是如此
  • 首先我想的是把输入的多个字符串数组分成单个的字符串数组,然后从下表0开始,对每个字符串数组进行比较是否相等,知道不相等位置,但这里就出现了问题,首先我们要明确一个输入了几个字符串,也就是几个数组,也就是我们每次循环需要做几次比较,其次,我们要明确到底要一共循环多少次
  • 在第一步将多个字符串的数组转换成单个字符串的数组时我们可以得到一个有多少个数组,并且可以得到每个数组的长度,很容易的我们可以知道总的循环次数最大值就是所有数组长度中最小的
  • 我们已经知道了一共要循环多少次,下面要解决的就是每次循环我们要比较几次,通过strs.length我们可以的到我们每次循环要比较的值的个数
  • 还有一点,我们要找到那个字符串最短的数组到底是那个,也就是下标是resultIndex的数组
  • 结束循环就得到了我们想要的结果,下面上代码
/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
    var arrLength=[]
    var result=[]
    var arr=[]
    strs.forEach((item,index) => {
        arr[index]=item
        arrLength.push(arr[index].length)
    })
    var arrlenthValue=arrLength.sort()
    var resultIndex =arrLength.indexOf(arrlenthValue[0])
    var minLength = arrlenthValue[0]
    var strsLength=strs.length
    var nowIndex=0
    while(nowIndex<minLength){
       for(let i=0;i<strsLength-1;i++){
           if(arr[i][nowIndex]===arr[i+1][nowIndex]){
               continue
           }else{
               return result.join('')
           }
       }
        result.push(arr[resultIndex][nowIndex])
        nowIndex++
       
    }
    return result.join('')
    
};

LeetCode运行结果如下:

最长前缀.PNG

结语

这道题做的我很头大,做的时候一直困惑在到底每次循环到底要比较多少个数组中的字符,感觉自己写的很复杂,有大佬有更好的解决方法的话欢迎评论,不胜感激。