linRichielinRichie
前端
Python
Linux
ChatGPT
  • B 站
  • 500px
前端
Python
Linux
ChatGPT
  • B 站
  • 500px
    • Python学习指南
  • 快速开始

    • Python: 输入与输出 (I/O)
    • Python: 异常处理 try-except
    • Python: List深入概述
    • Python: 面向对象编程(OOP)
  • Python 语法库函数

    • 语法库目录
    • 库

      • library目录
      • argparse:解析命令行参数
      • difflib:比较序列并生成差异信息
      • dnspython: DNS处理库
      • IPy:IP地址处理库
      • logging:记录和管理日志信息
      • os:访问和操作操作系统
      • psutil:系统性能信息库
      • re:正则表达式库
      • smtplib:邮件发送库
    • 函数

      • function目录
      • any() 函数
      • input 函数
      • lambda 和 map 函数
      • reversed()函数
      • zip()函数
    • 语句

      • statement目录
      • import 语句
      • Try/Exception 异常
    • 概念

      • concept目录
      • 深拷贝与浅拷贝
      • 列表、字典与元组
      • 文件读写
      • IO: 输入与输出
      • 逻辑判断与条件语句
      • OOP 面向对象:class
      • OOP: 面向对象编程
  • SQLAlchemy

    • 获取insert或者update的id
  • Pandas

    • Pandas目录
    • Pandas:基础操作
    • Pandas:数据处理与转换
    • Pandas: 数据写入 excel 表格
  • Python前端框架

    • Flask

      • 1. Flask简介
      • 2. Flask程序基本结构
      • 3. Flask请求-响应循环
      • 4. flask案例: 框架网页查询IP
      • Python: Flask中的GitHub OAuth
    • Django

      • chapter-01:Django框架认识

        • 1.1 Django的产生背景
        • 1.2 MTV设计模式
        • 1.3 Django 主要功能模块
      • chapter-02:开发环境配置

        • 2.1 Python的安装与配置
        • 2.2 虚拟环境安装与配置
        • 2.3 Django安装与配置
        • 2.4 MySQL安装配置
      • chapter-03:项目框架搭建

        • 3.1 Django管理工具-创建项目骨架
        • 3.2 修改项目的默认配置
        • 3.3 初始化项目环境
      • chapter-04:ORM应用与原理剖析

        • 4.1 构建POST应用需要的数据集
        • 4.2 Model相关的概念和使用方法
        • 4.3 Model的查询操作API
        • 4.4 ORM实现原理
      • chapter-05:Django管理后台

        • 5.1 将Model注册到管理后台
        • 5.2 管理后台实现原理
      • chapter-06:视图

        • 6.1 视图基础
        • 6.2 视图的高级特性和快捷方法
        • 6.3 基于类的通用视图
      • chapter-07:模板系统

        • 7.1 模板系统基础
        • 7.2 模板语言
      • chapter-08:表单系统

        • 8.2 使用表单系统实现表单: ModelForm
      • chapter-09:用户认证系统

        • 9.1 用户与身份认证
        • 9.2 权限管理
        • 9.3 用户认证系统应用
      • chapter-10:Django路由系统

        • 10.1 路由系统基础
      • chapter-11:Django中间件

        • 11.1 中间件基础
  • Python例子

    • Python: Linux的Shell命令
    • Python: PEP8自动格式化代码
    • Python: pip操作
    • Python: 业务服务监控
    • Python: 从文件逐行读取数据
    • 将链表转换为字符串
    • Python: 检查URL是否能正常访问
    • Python: 爬取网易云音乐
    • Python: 读取目录下的所有内容
    • 案例研究:文本统计
  • Python爬虫

    • 数据解析工具:Xpath
  • 算法题

    • 02:两数相加
    • 09:回文数
    • 13:罗马数值转换为整数
    • 14:最长公共前缀

14:最长公共前缀

  • 题目描述
    • 示例
    • 提示
  • 解题思路
    • 1. 水平扫描法
    • 2. 垂直扫描法
    • 3. 分治法
    • 4. 二分查找法
  • 代码实现
    • 垂直扫描法
    • zip 方法
    • 复杂度分析
  • 方法比较

题目描述

题目:

  • 编写一个函数来查找字符串数组中的最长公共前缀。
  • 如果不存在公共前缀,返回空字符串 ""。

示例

示例 1:

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

示例 2:

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

提示

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

解题思路

有多种方法可以解决此问题,每种方法都有其特点:

1. 水平扫描法

从前往后扫描每个字符串:

  1. 将第一个字符串假设为最长公共前缀。
  2. 遍历其余字符串,比较每个字符串与当前最长公共前缀,一旦发现不匹配的字符,立即减少公共前缀的长度。
  3. 继续此过程直到遍历完所有字符串。

2. 垂直扫描法

按列比较所有字符串的字符:

  1. 查看所有字符串的第一个字符,如果它们相同,继续到下一列;如果不同,算法结束。
  2. 重复此过程,直到字符串的末尾或者找到一个不匹配的字符。

3. 分治法

将问题分解为更小的子问题:

  1. 将字符串列表分成两半,分别找到每一半的最长公共前缀。
  2. 然后,将这两个前缀的公共部分作为结果。

4. 二分查找法

利用二分查找优化查找过程:

  1. 找到所有字符串中长度的最小值。
  2. 使用二分法在此范围内查找最长公共前缀。
  3. 检查每个字符串在这个中间长度上的前缀是否相同。

代码实现

垂直扫描法

def longestCommonPrefix(strs):
    """
    查找字符串数组中的最长公共前缀
    
    Args:
        strs: 字符串数组
        
    Returns:
        str: 最长公共前缀
    """
    if not strs:
        return ""

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

    # 逐列比较字符
    for i in range(min_length):
        char = strs[0][i]
        if any(s[i] != char for s in strs):
            return strs[0][:i]

    return strs[0][:min_length]

zip 方法

使用 Python 的 zip 函数进行字符比较:

from typing import List

def longestCommonPrefix(strs: List[str]) -> str:
    """
    使用 zip 函数查找最长公共前缀
    """
    res = ""
    for chars in zip(*strs):
        if len(set(chars)) == 1:
            res += chars[0]
        else:
            break
    return res

复杂度分析

  • 时间复杂度:O(S),其中 S 是所有字符串中字符数量的总和
  • 空间复杂度:O(1),只需要常数级别的额外空间

方法比较

  1. 垂直扫描法

    • 优点:实现简单,直观
    • 缺点:需要遍历所有字符
  2. zip 方法

    • 优点:代码简洁,利用 Python 内置函数
    • 缺点:可能消耗更多内存

注意:

  • 处理空字符串数组
  • 考虑字符串长度不一的情况
  • 注意内存使用效率

函数 reversed:reversed()指南

最近更新时间:
Prev
13:罗马数值转换为整数