leetcode每天一题:【最长公共前缀】(简单)

113 阅读1分钟

这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战

题目描述

leetcode题目地址

有一个字符串数组,然后找到这个数组的最长公共前缀,并返回它,如果没有公共前缀,则返回空字符串''。

举个例子:

arr:  ['abc', 'a', 'ab']
返回 ‘a’

arr:  ['erta', 'er', 'ert']
返回 ‘er’

arr:  ['ab', 'er', 'a']
返回 ‘’

思路分析

第一种方法:

我们可以对字符串数组取第一个为比较对象,遍历数组其它值,都与它进行比较。

然后定义个取公共前缀方法,把比较多字符串传入进行判断,while循环遍历,如果一直相等,则前缀的索引一直递增,直到不相等或者等于字符串本身的长度才返回索引。这个索引会和之前返回的索引比较,取小的。为什么取小的,因为小的才是公共前缀。

遍历结束,最终取到的的就是最长的公共前缀。

该解法参考字节跳动最爱考的 64 道算法题(JS版)

代码如下:

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function (strs) {
  if (strs.length === 0) return "";
  let first = strs[0];
  if (first === "") return "";
  let minLen = Number.MAX_SAFE_INTEGER;
  for (let i = 1; i < strs.length; i++) {
    const len = twoStrLongestCommonPrefix(first, strs[i]);
    minLen = Math.min(len, minLen);
  }
  return first.slice(0, minLen);
};
function twoStrLongestCommonPrefix (s, t) {
  let i = 0, j = 0;
  let cnt = 0;
  while (i < s.length && j < t.length) {
    if (s[i] === t[j]) {
      cnt++;
    } else {
      return cnt;
    }
    i++;
    j++;
  }
  return cnt;
}

image.png

第二种方法:

因为是求字符串数组的最长公共前缀,所以一定以长度最小的字符串为准,所以我们可以先排好序,根据字符串长度排,最短的排在第一个。

然后我们对第一个的字符串进行遍历,每遍历一次,就取从0到当前索引的字符串,就判断字符串数组的其它项是否每个都包含该字符串,如果包含则把它记录下来。

最后返回。这个就是最长公共前缀。

如果字符串数组长度为0,则返回空字符串。

代码如下:

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function (strs) {
  if (strs.length <= 0) return ''
  let res = ''
  strs.sort((a, b) => a.length - b.length)
  let str = strs[0]
  for (let i = 0; i < str.length; i++) {
    let checkStr = str.slice(0, i + 1)
    if (strs.slice(1).every(item => item.slice(0, i + 1) === checkStr)) res = checkStr
  }
  return res
}

image.png