前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一天一大 leet(最长公共前缀)难度:简单 DAY-15

一天一大 leet(最长公共前缀)难度:简单 DAY-15

作者头像
前端小书童
发布2020-09-24 11:21:34
1800
发布2020-09-24 11:21:34
举报
文章被收录于专栏:前端小书童
题目(难度:简单):

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

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

示例

代码语言:javascript
复制
输入: ["flower","flow","flight"]
输出: "fl"
代码语言:javascript
复制
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。

说明

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

抛砖引玉

  1. 如果输入空数组则返回空
  2. 任取一个字符串长度假设为最大相同长度
  3. 循环字符串数组找到与这个长度前 n 位相同,求 n,
    • 求 n,截取前 n 位比较
    • 不相同则 n--,知道找到相同
代码语言:javascript
复制
/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function (strs) {
  if (!strs.length) return ''
  let _resultNum = strs[0].length - 1
  for (let i = 1; i < strs.length; i++) {
    while (
      strs[i - 1].substring(0, _resultNum + 1) !==
      strs[i].substring(0, _resultNum + 1)
    ) {
      _resultNum--
    }
  }
  return strs[0].substring(0, _resultNum + 1) || ''
}

官方答案

横向扫描

  • 使用递归每次比较出来的公共前缀与之后的字符串比较
  • 递归中,每个字符串的位置均需要比较
代码语言:javascript
复制
/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function (strs) {
  if (strs == null || strs.length == 0) {
    return ''
  }
  var prefix = strs[0]
  var count = strs.length
  for (var i = 1; i < count; i++) {
    prefix = CommonPrefix(String(prefix), String(strs[i]))
    if (prefix.length == 0) {
      break
    }
  }
  return prefix

  function CommonPrefix(str1, str2) {
    var length = Math.min(str1.length, str2.length)
    var index = 0
    while (index < length && str1.charAt(index) == str2.charAt(index)) {
      index++
    }
    return str1.substring(0, index)
  }
}

纵向扫描

从前往后遍历所有字符串的每一列,比较相同列上的字符是否相同,

  • 如果相同则继续对下一列进行比较,
  • 如果不相同则当前列不再属于公共前缀,当前列之前的部分为最长公共前缀
代码语言:javascript
复制
/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function (strs) {
  if (strs == null || strs.length == 0) {
    return ''
  }
  var length = String(strs[0]).length
  var count = strs.length
  for (var i = 0; i < length; i++) {
    var c = strs[0].charAt(i)
    for (var j = 1; j < count; j++) {
      if (i == strs[j].length || strs[j].charAt(i) != c) {
        return strs[0].substring(0, i)
      }
    }
  }
  return strs[0]
}

其他解法

re 初始化为数组中第一个元素,逐个比较,当比较通过时返回 re,否则削去末位直至比较通过

代码语言:javascript
复制
/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function (strs) {
  var re = strs[0] ? strs[0] : ''
  for (var i = 1; i < strs.length; i++) {
    var regex = new RegExp('^' + re)
    while (!regex.test(strs[i]) && re.length) {
      re = re.slice(0, re.length - 1)
      regex = new RegExp('^' + re)
    }
  }
  return re
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端小书童 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档