LeetCode刷题挑战-javascript:14.最长公共前缀

379 阅读1分钟

「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

题目

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

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

示例 1:

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

示例 2:

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

提示:

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

解题思路

首先我们需要看清题目,是求最长的公共前缀,而不是最长的公共字符串。

(本人在这里踩了很久的坑,相比求公共字符串,求最长的公共前缀肯定简单多了)

我们可以知道的是result一定是比其中任何一个字符串都要短的。

还有两个需要注意的临界条件:

数组为空的时候,最长公共前缀为空字符串

数组长度为1的时候,最长公共前缀就是strs[0]

方法一

  1. 先排除无长度的情况
  2. 先拿第一个和第二个对比,获取最短的那个字符串长度循环
  3. 字符比较时,发现字符不相等,就可以根据循环比较的次数,更新字符长度。字符为0时,直接退出程序。
  4. 全部字符都对比过后,拿字符长度直接获取结果
var longestCommonPrefix = function (strs) {
    if (!strs.length) return '';

    let temp = strs[0];
    let len = temp.length;
    for (let i = 1; i < strs.length; i++) {
        len = len < strs[i].length ? len : strs[i].length;
        if (len === 0) return '';
        for (let j = 0; j < len; j++) {
            if (temp[j] !== strs[i][j]) {
                len = j;
                break;
            }
        }
    }
    return temp.substr(0, len);
};

方法二:数组排序法

  1. 先排除长度为 0 和 1 的情况。
  2. 对数组进行排序,sort 用默认排序,或使用 strs.sort((a, b) => a > b? 1: -1) 方法排序。
  3. 排序好的数组,获取数组头和尾两个数据,获取最短的字符串长度做为遍历次数。
  4. 遍历获取相同前缀字符串。
var longestCommonPrefix = function (strs) {
    if (strs.length === 0) return '';
    else if (strs.length === 1) return strs[0];

    strs.sort();

    let start = strs[0],
        end = strs[strs.length - 1],
        len = start.length < end.length ? start.length : start.length,
        result = '';
    for(let i = 0; i < len; i++) {
        if (start[i] !== end[i]) break;
        result += start[i];
    }
    return result;
};