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