【前端也得会算法】14. 最长公共前缀[ 简单 ]

151 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

一、题目描述:

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

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

示例:

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

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

提示:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 仅由小写英文字母组成

二、题解:

这道题需要字符串每一位一一匹配。

这里需要使用循环遍历数组每一个,得到每一组字符串,再根据下标匹配字符串每一位,只要存在位数不同跳出即可

注意越界情况

方法一 循环匹配法

  • 原理。根据题解循环匹配叠加即可。
  • 思路。
    • 默认取第0个的index位
    • 字符串每一个都相同的话,则res叠加
    • 字符串有一位不同则跳出循环

代码:

 var longestCommonPrefix = function(strs) {
  let res = ''
  let index = 0
  let flag = true
  while(flag){
    // 防止越界情况
    if(index>=strs[0].length){
        flag = false
        break
    }
    let temp = strs[0][index]
    for(let i = 0;i< strs.length;i++ ){
      // 如果每一个的第index个都想等,则在最后一个进行增加
      if(strs[i][index] === temp){
        i === strs.length-1 && (res += temp?temp:'')
      }else {
        flag = false
        break
      }
    }
    index++
  }
  return res
};

image.png

方法二 巧用遍历法

  • 原理。根据题解利用every匹配相关条件且判断每一个都匹配即可。
  • 思路。
    • 声明下标end
    • 使用every循环当做while的跳出判断
    • 当end大于等于每一个的长度时且存在一个不匹配第0个时的end时
    • 跳出循环
    • 截取结果

代码:

var longestCommonPrefix = function(strs) {
    let end=0
    // 当end小于每一个的长度时且每一个都匹配第0个时
    while(strs.every(item => (end<item.length) && (strs[0][end]===item[end]) )) 
    end++
    return strs[0].slice(0,end)
};

image.png

三、总结

  • 此题可以循环匹配法巧用遍历法两种方案
  • 循环匹配法主要是根据题解循环匹配叠加即可。
  • 巧用遍历法主要是根据题解利用every匹配相关条件且判断每一个都匹配即可。

文中如有错误,欢迎在评论区指正