关于leetcode:力扣之最长公共前缀

35次阅读

共计 1293 个字符,预计需要花费 4 分钟才能阅读完成。

问题形容

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

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

示例 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,最初依照思路来就行了。提交当前,如果不通过,再剖析不通过的起因,进行代码优化即可

正文完
 0