返回

LeetCode 300 题之 (14) 最长公共前缀:从零开始的算法入门指南

前端

导读:

LeetCode 作为全球著名的算法练习平台,为广大程序员提供了丰富的题目库和完善的学习体系。在这篇博文中,我们将深入浅出地讲解 LeetCode 300 题之 (14) 最长公共前缀,带领你从零开始入门算法世界。通过思维导图、全部解法和示例代码,我们旨在让你全面掌握这道题目的精髓,为你的算法之旅奠定坚实的基础。

一、题目

给定一个字符串数组 strs,找到其中所有字符串的 最长公共前缀。

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

例如:

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

二、解法总览(思维导图):

[图片:思维导图]

三、全部解法:

1 方案 1:水平扫描

def longestCommonPrefix(strs):
  """
  :type strs: List[str]
  :rtype: str
  """
  if not strs:
    return ""

  # 找出最短的字符串
  min_length = min(len(s) for s in strs)

  # 逐个字符比较,直到遇到不匹配的字符
  prefix = ""
  for i in range(min_length):
    char = strs[0][i]
    for j in range(1, len(strs)):
      if strs[j][i] != char:
        return prefix
    prefix += char

  return prefix

2 方案 2:二分查找

def longestCommonPrefix(strs):
  """
  :type strs: List[str]
  :rtype: str
  """
  if not strs:
    return ""

  # 找出最短的字符串
  min_length = min(len(s) for s in strs)

  # 二分查找公共前缀的长度
  low, high = 0, min_length - 1
  while low <= high:
    mid = (low + high) // 2
    prefix = strs[0][:mid + 1]
    if all(strs[i][:mid + 1] == prefix for i in range(1, len(strs))):
      low = mid + 1
    else:
      high = mid - 1

  # 返回找到的公共前缀
  return strs[0][:low]

总结:

通过对 LeetCode 300 题之 (14) 最长公共前缀的深入剖析,我们掌握了两种高效的解法:水平扫描和二分查找。这些算法不仅适用于这道具体题目,更体现了算法设计中常用的技术。通过不断地练习和总结,你一定能够在算法的道路上披荆斩棘,成就斐然!