问题形容

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

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

示例 1:

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

示例 2:

输出:strs = ["dog","racecar","car"]输入:""解释:输出不存在公共前缀。
力扣原题目地址:https://leetcode.cn/problems/...

解决方案

思路剖析

  • 对于这样的题目,首先要排除非凡状况,比方数组中只有一项,若只有一项,即这一项就是最长公共前缀。所以独自判断length是否等于1即可
  • 天然是公共前缀,那么咱们能够取到字符串的单词去判断,当下的这个单词是否后续每一项都存在,所以咱们会相当数组的every办法
  • 既然是公共前缀,即为,对应字符串结尾的前缀,咱们会想到字符串的startsWith办法
  • 比方数组为:['abc','abcd','abcde']。咱们就间接以第一项为基准,取到第一项的第一个单词,a,而后看看这个a是不是后续每一项也是以a结尾的。若是的,再往后取一位(这里要拼接变成ab),而后往后看一下,是不是每一项都是以ab结尾的。
  • 如此循环,直到其中有一项不合乎以ab结尾的。当不合乎某个条件的时候,退出循环,咱们就会相到while循环

代码如下

// 额定抽离出一个函数,用于判断function startFn(strs, s) {    let flag = strs.every((item) => {        if (item.startsWith(s)) { // 必须每一项都要合乎以xxx结尾,才返回true            return true        }    })    return flag}var longestCommonPrefix = function (strs) {    // 如果数组只有一项,那么最长公共前缀就是本身    if (strs.length == 1) {        return strs[0]    }    // 如果数组有多项,就要去遍历比照    if (strs.length >= 2) {        // 如果数组中第一项是空字符串的,那么所有的公共前缀就是空字符串        // 这里须要留神空字符串没有第0项即: ""[0] === undefined        if (!strs[0][0]) {            return ''        }        // 排除空字符串的状况,咱们在失常遍历即可        let i = 0 // 这里的i是为了让第一项的单词累加        let s = strs[0][i]        while (startFn(strs, s)) {            i = i + 1            if (i > strs[0].length - 1) {                // while外部的return阐明曾经全副循环完了(每一项长得都一样)                return s            } else {                s = s + strs[0][i]            }        }        // while内部的循环阐明到某一个单词的时候,别的单词没有,即没有更大的最长公共前缀了        return s.slice(0, -1) // 留神这里须要截取一下,多了一个单词。因为上方的s = s + strs[0][i] 多加了一次    }};

性能还能够截图如下

总结

对于这种相似的题目,首先把一些非凡状况排除掉,而后在考虑的过程中,想想咱们能够应用到哪些办法api,最初依照思路来就行了。提交当前,如果不通过,再剖析不通过的起因,进行代码优化即可