LeetCode 14. 最长公共前缀

92 阅读1分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

14. 最长公共前缀

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

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

示例 1:

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

示例 2:

输入: strs = ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。

提示:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 仅由小写英文字母组成

思路:

  • 从字符串数组中随便选一个作为被比较的prefix,比如strs[0]

  • 判断prefix是否是strs数组中每个元素的子串

    • 如果是,则跳过,不进入内循环
    • 如果不是,则将待比较的 prefix 从后向前不断缩短,直至prefix长度减为0,或者找到了满足字符串数组中属于每个元素的最长公共前缀
  • 最后返回prefix即可~(注意这里使用了go自带的库函数 strings.HasPrefix() 来判断前缀)

时间复杂度: O(mn),其中 m 是字符串数组中的字符串的平均长度,n 是字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次。

空间复杂度: O(1)

func longestCommonPrefix(strs []string) string {
    // 公共前缀比所有字符串都短,随便选一个先,比如第一个元素
    var prefix string = strs[0]

    for _, str := range strs {
       for strings.HasPrefix(str, prefix) == false {
            if len(prefix) == 0 {
                return ""
            }

            // 公共前缀不匹配就让它变短!(因为需要最长前缀,所以从后向前不断缩短被比较的prefix)
            prefix = prefix[:len(prefix)-1]
       }
    }

    return prefix
}