【力扣刷题记 14】——《最长公共前缀》

145 阅读2分钟

Offer 驾到,掘友接招!我正在参与 2022 春招打卡活动,点击查看活动详情

一、题目描述:

  1. 最长公共前缀-难度简单

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

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

 

示例 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天,早上发通知让大家去买物资,几十平的小超市人挤人,排队打价格半小时,排队付款半小时。嗐~ 疫情爆发两年多来,第一次觉得离自己这么近,希望一切继续顺顺利利吧。

加油吧!

image.png