力扣之最长公共前缀
问题描述
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
【力扣之最长公共前缀】示例 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,最后按照思路来就行了。提交以后,如果不通过,再分析不通过的原因,进行代码优化即可
推荐阅读
- 投稿|雅迪高端之后开始变慢
- 汽车|孚能科技王志刚:电池行业未来不是企业间的竞争,而是产业链之争
- HCNP|HCNP Routing&Switching之DHCP中继
- 期盼已久全平台支持-开源IM项目OpenIM之uniapp更新
- 茶.禅.一味
- iOS开发之升级Xcode后插件失效
- 最新科技|ESMFold: AlphaFold2之后蛋白质结构预测的新突破
- 科研人生|刘小乐教授(我与生物信息学的不解之缘)
- 投稿|茅台冰淇淋“逆势”走红,跨界之意却并不在“卖雪糕”
- 前端|web学习笔记之JavaScript(一)