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

时间:2022-07-25
本文章向大家介绍一天一大 leet(最长公共前缀)难度:简单 DAY-15,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目(难度:简单):

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

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

示例

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

说明

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

抛砖引玉

  1. 如果输入空数组则返回空
  2. 任取一个字符串长度假设为最大相同长度
  3. 循环字符串数组找到与这个长度前 n 位相同,求 n,
    • 求 n,截取前 n 位比较
    • 不相同则 n--,知道找到相同
/**
 * @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) || ''
}

官方答案

横向扫描

  • 使用递归每次比较出来的公共前缀与之后的字符串比较
  • 递归中,每个字符串的位置均需要比较
/**
 * @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)
  }
}

纵向扫描

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

  • 如果相同则继续对下一列进行比较,
  • 如果不相同则当前列不再属于公共前缀,当前列之前的部分为最长公共前缀
/**
 * @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,否则削去末位直至比较通过

/**
 * @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
}