Offer 驾到,掘友接招!我正在参与 2022 春招打卡活动,点击查看活动详情。
一、题目描述:
- 最长公共前缀-难度简单
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"] 输出:"fl" 示例 2:
输入:strs = ["dog","racecar","car"] 输出:"" 解释:输入不存在公共前缀。
提示:
1 <= strs.length <= 200 0 <= strs[i].length <= 200 strs[i] 仅由小写英文字母组成
二、题目和思路分析:
这道题写的简单,所以我是这么想的:
1,找出最短的字符串,把它当成最长公共前缀s1。
2,如果任一个字符串不匹配,则将公共前缀减1位,继续匹配该字符串。
3,反之则都匹配,返回当前匹配值。
这种做法遍历次数有点多,如果两端同时进行匹配,遍历次数会少一半,即加上如下逻辑:
1,找出最短的字符串的首位字符,把它当成最长公共前缀s2。
2,如果匹配,则将公共前缀加1位,继续匹配该字符串。
3,反之则不匹配,此时应该返回上一个匹配值。
4,当s2.length >= s1.length时,结束遍历。
但是我突然间想到,找到最短字符串的值也需要遍历啊。。。
那么直接把第一个字符串作为最短字符串来处理也是可以的。
假设第一个字符串为最长公共前缀s1
假设最后一个字符串为最长公共前缀s2
对比s1和s2,取它们的公共前缀作为最长公共前缀。
然后将这个前缀和数组第二项和最后一项进行取公共前缀,循环往复即可。也就是说,求得三个字符串中公共的最长前缀。
但是我突然又想到,取前缀又遍历太麻烦了,既然能求得三个字符串的公共前缀,为什么不直接求n个字符串的公共前缀呢?
于是我开始试着写求n个字符串公共前缀的方法代码,写了半天才发现完全取不到啊,如果有这个方法,那不就直接是题目的答案吗?
我还是两头同时遍历吧!
三、代码:
代码实现如下:
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function(strs) {
let i = 1
let j = strs.length-1
let ss = strs[0]
while(i<=j){
if(ss == '') return ''
ss = getPrefix(ss, strs[i++], strs[j--])
}
return ss
// 取三个字符的公共前缀
function getPrefix(s1, s2, s3){
if(s1 == s2 && s1 == s3) return s1
let s = ''
let ss = ''
if(s1.length <= s2.length && s1.length <= s3.length){
s = s1
}else if(s2.length < s1.length && s2.length <= s3.length){
s = s2
}else{
s = s3
}
let i = 0
while(i < s.length){
if(s1[i] == s2[i] && s1[i] == s3[i]){
ss += s1[i++]
}else{
i = s.length
}
}
return ss
}
}
四、总结:
这道题虽然写的是简单,但是我觉得比我最开始做的困难和中等的题难度差不多,大概之前做题只想着遍历求解,现在想的多了,老想着能不能优化一点,再优化一点,还有没有更优的解法之类的。
之前一直晚上9-10点睡觉来着,现在自从居家办公,时间变得越来越快,不知不觉马上11点了,而我还在写这篇文章。
说起来居家办公,由于小区有确诊病例,本来隔离过2天,现在又要隔离14天,早上发通知让大家去买物资,几十平的小超市人挤人,排队打价格半小时,排队付款半小时。嗐~ 疫情爆发两年多来,第一次觉得离自己这么近,希望一切继续顺顺利利吧。
加油吧!