LeetCode【0014】最长公共前缀

本文目录

  • 1 中文题目
  • 2 求解思路
    • 2.1 基础解法:排序法
    • 2.2 优化解法:滑动窗口法
    • 2.3 最优解法:基于python内置函数的横向扫描法
  • 3 题目总结

1 中文题目

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

示例 :

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

提示:

  • 1 ≤ s t r s . l e n g t h ≤ 200 1 \leq strs.length \leq 200 1strs.length200
  • 0 ≤ s t r s [ i ] . l e n g t h ≤ 200 0 \leq strs[i].length \leq 200 0strs[i].length200
  • s t r s [ i ] strs[i] strs[i] 仅由小写英文字母组成

2 求解思路

2.1 基础解法:排序法

思路

先对字符串数组进行字典序排序,然后只需要比较首尾两个字符串的公共前缀即可。因为字典序排序后,第一个和最后一个字符串的差异最大,它们的公共前缀一定是整个数组的公共前缀。

# 原始数组:["flower", "flow", "flight", "flake"]
sorted_strs = sorted(strs)
# 排序后:["flake", "flight", "flow", "flower"]# 获取首尾字符串
first = "flake"
last = "flower"

Python代码

class Solution:def longestCommonPrefix(self, strs: List[str]) -> str:"""使用排序法查找字符串数组中的最长公共前缀思路:1. 对字符串数组进行字典序排序2. 只需比较首尾两个字符串3. 找出它们的公共前缀即为结果参数:strs: 字符串数组,如 ["flower","flow","flight"]返回:最长公共前缀字符串,如 "fl""""# 处理特殊情况if not strs:return ""if len(strs) == 1:return strs[0]# 对字符串数组进行字典序排序# 排序后,第一个和最后一个字符串的差异最大sorted_strs = sorted(strs)# 获取首尾字符串first = sorted_strs[0]last = sorted_strs[-1]# 获取首尾字符串的最短长度min_length = min(len(first), len(last))# 查找公共前缀result = []for i in range(min_length):# 如果字符不同,直接返回当前累积的前缀if first[i] != last[i]:breakresult.append(first[i])# 返回找到的最长公共前缀return ''.join(result)

时空复杂度分析

  • 时间复杂度分析:O(nlogn + m)
    • 排序:O(nlogn),n为字符串数量
    • 比较:O(m),m为最短字符串长度
  • 空间复杂度分析:O(n + m)
    • 排序空间:O(n)
    • 结果空间:O(m)

2.2 优化解法:滑动窗口法

思路
从第一个字符开始,逐步扩展窗口大小,每次检查所有字符串在当前位置是否具有相同的字符。一旦发现不同字符,立即停止扩展并返回当前的公共前缀。

python代码

class Solution:def longestCommonPrefix(self, strs: List[str]) -> str:"""滑动窗口法:使用逐步扩展窗口的方式"""# 处理特殊情况if not strs:return ""# 初始化窗口大小为1prefix = ""min_length = min(len(s) for s in strs)# 逐步扩展窗口for i in range(min_length):current_char = strs[0][i]# 检查所有字符串在当前位置的字符是否相同if all(s[i] == current_char for s in strs):prefix += current_charelse:breakreturn prefix

时空复杂度分析

  • 时间复杂度分析:
    • 最好情况:O(n),n为最短字符串长度
    • 最坏情况:O(S),S为所有字符的总和
    • 平均情况:O(n×m),m为字符串个数
  • 空间复杂度分析:O(1)

2.3 最优解法:基于python内置函数的横向扫描法

思路
使用zip函数将所有字符串按位置压缩,然后逐位比较每个位置上的字符是否相同。当发现不同字符时,即可确定最长公共前缀的长度。

详细步骤解析:

  • zip函数的工作原理:
    • zip(*strs)将所有字符串解包,按位置将字符组合成元组
例如:["abc", "abd", "abf"] 转换为:
('a','a','a') # 第一位
('b','b','b') # 第二位
('c','d','f') # 第三位
  • enumerate的使用:
    • 提供当前处理的位置索引,同时获取当前位置的字符元组。i表示位置,chars表示该位置的所有字符
  • set去重判断:
    • set(chars)将字符元组转为集合,相同字符的集合长度为1,不同字符的集合长度大于1
  • 结果处理:
    • 发现不同时返回前i个字符,全部相同时返回最短字符串

示例

# 输入:strs = ["flower","flow","flight"]
# zip(*strs) 生成:
# 第1轮:('f','f','f')   # set长度为1,继续
# 第2轮:('l','l','l')   # set长度为1,继续
# 第3轮:('o','o','i')   # set长度为2,返回"fl"

python代码

class Solution:def longestCommonPrefix(self, strs: List[str]) -> str:"""使用zip函数实现 参数:strs: 字符串数组返回:最长公共前缀字符串"""# 处理特殊情况if not strs:return ""# 使用zip函数将所有字符串按位置打包for i, chars in enumerate(zip(*strs)):# 检查当前位置的所有字符是否相同if len(set(chars)) != 1:# 不相同时返回之前的前缀return strs[0][:i]# 所有字符都相同,返回最短字符串return min(strs, key=len)

时空复杂度分析

  • 时间复杂度分析:O(S):S是所有字符串的字符数总和
    • zip操作需要遍历所有字符
    • set操作为O(1)
    • min操作为O(n),n为字符串个数
  • 空间复杂度分析:O(1)

3 题目总结

题目难度:简单
数据结构:字符串数组
应用算法:python内置函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/470286.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 堆内存管理详解:`-Xms` 和 `-Xmx` 参数的使用与默认内存设置

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

Linux探秘坊-------1.系统核心的低语:基础指令的奥秘解析(1)

1.Linux的背景介绍 Linux 操作系统的发展历程充满了激情与创新喵~🎀 萌芽期 (1983 - 1991):Linux 的历史可追溯到 1983 年,理查德斯托曼 (Richard Stallman) 发起 GNU 计划,目标是创建一个自由软件操作系统。1987 年发…

AI写作(二)NLP:开启自然语言处理的奇妙之旅(2/10)

一、NLP 的基本概念与任务 (一)自然语言处理的研究对象 自然语言处理(NLP)处于计算机科学、人工智能和语言学的交叉领域。它所聚焦的人类社会语言信息是无比丰富和复杂的,包括口语、书面语等各种形式。这种语言信息在…

使用CubeMX一键配置Freertos

一、配置参数 1.1 API信息 1.2 版本信息 版本信息 FreeRTOS版本为10.3.1 CMSIS-RTOS 版本为2.00 如果我们不用CubeMX配置的话 还是推荐移植正点原子的,因为它的裁剪头文件比较清晰 就是那个conf的头文件,一键配置的话很方便。可能会跟原版移植的Freert…

如何提高自动驾驶中惯性和卫星组合导航pbox的精度?

Mems纯惯导里程推算精度做到千分之一,两分钟航向精度保持0.001弧度,是如何做到的? 【飞迪sigma车规高精度组合导航系统在3.6km长隧道下穿测试,135s纯惯导航向保持精度小于0.06度,隧道内转弯轨迹和直线航位推算重合#智能…

10款PDF翻译工具的探索之旅:我的使用经历与工具特色!!

在如今的时代,PDF文件已经成为我们工作、学习和生活中不可或缺的一部分。但是,当遇到一些非母语或陌生语言的PDF文档时,这要怎么办呀!这时候翻译工具就显得尤为重要了。这也是我所遇到过的难题,现在我将与大家分享几款…

MySQL_第13章_视图

1. 常见的数据库对象 2. 视图概述 2.1 为什么使用视图? 视图一方面可以使用表的一部分而不是所有的表,另一方面也可以针对不同的用户制定不同的查询视图。 2.2 视图的理解 视图是一种虚拟表,本身是不具有数据的,占用很少的内存…

【测试框架篇】单元测试框架pytest(1):环境安装和配置

一、pytest简介 Pytest是Python的一种单元测试框架,与Python自带的unittest测试框架类似,但是比 unittest框架使用起来更简洁,效率更高。 二、pytest特点 Pytest是一个非常成熟的Python测试框架,主要特点有以下几点: 非常容易…

Camera Tuning中AE/AWB/AF基础知识介绍

3A定义 3A是Camera ISP控制算法的一个重要组成部分,通常分为自动曝光(AE)、自动聚焦(AF)、自动白平衡(AWB)三个组件。 自动曝光(Auto Exposure) AE基本概念 曝光概念…

group_concat配置影响程序出bug

在 ThinkPHP 5 中,想要临时修改 MySQL 数据库的 group_concat_max_len 参数,可以使用 原生 SQL 执行 来修改该值。你可以通过 Db 类来执行 SQL 语句,从而修改会话(Session)级别的变量。 步骤 设置 group_concat_max_l…

linux 下查看程序启动的目录

以azkaban为例 第一步、ps -ef | grep azkaban 查询出进程号 第二步、cd /proc/ 第三步 、cd 进程号 第四部 ll 查看详情 查看jar 位置 查看jar 启动命令

Linux设置Nginx开机启动

操作系统环境:CentOS 7 【需要 root 权限,使用 root 用户进行操作】 原理:利用 systemctl 管理服务 设置 Nginx 开机启动 需要 root 权限,普通用户使用 sudo 进行命令操作 原理:利用 systemctl 管理服务 1、新建…

红帽认证和华为认证哪个好?看完这4点你就明白了

就算在一堆的认证里面,华为和红帽也因为它们特别权威、含金量特别高而显得特别突出,简直就是行业里的榜样。只要拿到了其中随便哪一个证书,就说明证书持有者的网络技术很厉害,找工作的时候常常能给自己加点分。 不过好多人都不太…

初始JavaEE篇 —— 网络编程(2):了解套接字,从0到1实现回显服务器

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏:JavaEE 目录 TCP 与 UDP Socket套接字 UDP TCP 网络基础知识 在一篇文章中,我们了解了基础的网络知识,网络的出…

❤React-JSX语法认识和使用

1、JSX基本使用​ JSX是React的核心 JSX是ES的扩展 jsx语法 -> 普通的JavaScript代码 -> babel React可以使用JSX的前提和原因: React生态系统支持: 脚手架通常用于构建React应用程序,而JSX是React框架的核心语法之一。因此&#xf…

中文书籍对《人月神话》的引用(161-210本):微软的秘密

中文书籍对《人月神话》的引用(第001到160本)>> 《人月神话》于1975年出版,1995年出二十周年版。自出版以来,该书被大量的书籍和文章引用,直到现在热潮不退。 2023年,清华大学出版社推出《人月神话》…

【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-最大的数

CL13 最大的数(20 分) 输入一个有 n 个无重复元素的整数数组 a&#xff0c;输出数组中最大的数。提示&#xff1a;如使用排序库函数 sort()&#xff0c;需要包含头文件#include 。输入&#xff1a; 第一行是一个正整数 n(2<n<20)&#xff1b; 第二行包含 n 个不重复的整…

DHCP与FTP

DHCP dhcp&#xff1a;动态主机配置的协议&#xff0c;应用在大型的局域网环境中 服务端和客户端 服务端&#xff1a;提供IP地址&#xff0c;某种特定功能的提供者 客户端&#xff1a;请求IP地址&#xff0c;请求对应的功能的使用者 服务端的端口号&#xff1a;67 客户端的端…

Spark 的容错机制:保障数据处理的稳定性与高效性

Spark 的介绍与搭建&#xff1a;从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交&#xff1a;本地与集群模式全解析-CSDN博客 Spark on YARN&#xff1a;Spark集群模式…

【Qt-ROS开发】使用 Qt Creator 构建和编译含 ROS 库的 Qt 项目

【Qt-ROS】使用 Qt Creator 构建和编译含 ROS 库的项目 网上大多数办法是在 Qt creator中安装 ros_qtc_plugin 插件&#xff0c;项目以 ROS1 工作空间的形式构建&#xff0c;还是使用 catkin 来构建整个项目。但是这种方式局限很大&#xff0c;导入 Qt 的组件反而变得很麻烦&a…