LeetCode#14. 最长公共前缀

109 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

1.描述

14. 最长公共前缀

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

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

示例 1:

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

示例 2:

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

 

提示:

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

2.分析

  1. 过滤掉无值和只有一个值的情况
  2. 取出列表中最短的字符串(如果有最长公共前缀,最多也就是其中最短的一个值)
  3. 遍历列表,判断每一个字符串在从开头截取出来的同等长度下是否一样,一样的话,计数加1;不一样直接跳过
  4. 判断本次循环结束最终的计数是否与列表长度一致,一致,说明这就是最长公共前缀
  5. 不一致,将当前最短值截取掉最后一位,加上死循环,再次进行判断
  6. 如果没有公共前缀,在最短值切成空字符串时,判断相等,循环结束

3.AC代码

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        if len(strs) == 0:
            return ""
        if len(strs) == 1:
            return strs[0]
        # 取出列表中最短的值
        s_min = min(strs, key=len)
        while 1:
            t_num = 0  # 本次循环中能对上的数量
            for i in range(len(strs)):
                if s_min == strs[i][:len(s_min)]:
                    t_num += 1
            if t_num == len(strs):
                return s_min
            s_min = s_min[:-1]

        return ""

4.总结

纵向解法比较符合我们平时的思考过程,官方居然给了4种答案,感觉有点强行加戏了。

不过话说回来,分治的思想确实更高级一些。

参考

画解算法:14. 最长公共前缀 - 最长公共前缀 - 力扣(LeetCode) (leetcode-cn.com)

14. 最长公共前缀,python3 - 最长公共前缀 - 力扣(LeetCode) (leetcode-cn.com)

JavaScript 最长公共前缀 - 最长公共前缀 - 力扣(LeetCode) (leetcode-cn.com)