力扣14. 最长公共前缀

71 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情

力扣14. 最长公共前缀

一、题目描述:

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

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

示例 1:

输入:strs = ["flower","flow","flight"]

输出:"fl"

示例 2:

输入:strs = ["dog","racecar","car"]

输出:""

解释:输入不存在公共前缀。

提示:

1 <= strs.length <= 200

0 <= strs[i].length <= 200

strs[i] 仅由小写英文字母组成

来源:力扣(LeetCode)

链接:leetcode.cn/problems/lo…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

  1. 这道题考察了什么思想?你的思路是什么?

    我的思路比较简单,每次遍历字符串,或者将每个字符串放入一个rune切片,然后每次取一个序号,直到最短的字符串或切片长度。

    然后如果相等就记录,然后达到下一个序号,如果不等就停止,然后返回字符串。

  2. 做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

    不是一次通过的,刚开始代码是下面这样写的:

    func longestCommonPrefix(strs []string) string {
        min := 200 + 1
        for _,s := range strs{
            length := len(s)
            if length < min {
                min = length
            }
        }
        max := ""
        for i:=0;i<min;i++{
            flag := strs[0][i]
            for _,s := range strs{
                if s[i] == flag{
                    max += string(s[i])
                } else{
                    return max
                }
    ​
            }
        }
        return max
    }
    

    这样会导致每次比对都在要返回的字符串中连接一个字符:

    输入
    ["flower","flow","flight"]
    输出
    "fffllloo"
    预期结果
    "fl"
    

    看到这个结果,我一想,当出现strs长度个字符是不是就可以添加了,而少于这个长度我们就不添加即可。果然最后通过了!

    执行结果:

    通过

    执行用时:0 ms, 在所有 Go 提交中击败了100.00%的用户

    内存消耗:2.2 MB, 在所有 Go 提交中击败了21.80%的用户

    通过测试用例:124 / 124

  3. 有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

    工作中这种函数就怕来一个nil或[]string{}给你搞出一个死循环来。 这里,我们按题设知道不用做“排错”,所以,第一行的strs[0]如果越界panic相当于一个自排错,好过死循环。

    func longestCommonPrefix(strs []string) string {
        base := strs[0] //1)panic自排错不会死循环
        for i:=0; i<len(base); i++ {
            for _, str := range strs[1:] {
                if i >= len(str) || str[i] != base[i] {
                    return base[:i]
                }
            }
        }
        return base
    }
    ​
    作者:pandaoknight
    链接:https://leetcode.cn/problems/longest-common-prefix/solution/by-pandaoknight-wmix/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

三、AC 代码:

func longestCommonPrefix(strs []string) string {
    min := 200 + 1
    for _,s := range strs{
        length := len(s)
        if length < min {
            min = length
        }
    }
    max := ""
    for i:=0;i<min;i++{
        flag := strs[0][i]
        num := 0
        for _,s := range strs{
            if s[i] == flag{
                num+=1
                if num == len(strs){
                    max += string(s[i])
                }
​
            } else{
                return max
            }
​
        }
    }
    return max
}

四、总结:

这道题目比较简单,关键是思路问题,我的解法看来还不错!哈哈哈,但是字符串合并貌似是建立一个新字符串,导致空间复杂度有点大!

模板来源

作者:掘金酱

链接:juejin.cn/post/706970…

来源:稀土掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。