【面试经典 150 | 数组】最长公共前缀

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 解题思路
    • 方法一:横向扫描
    • 方法二:纵向扫描
    • 方法三:分治
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【数组】【字符串】


题目来源

14. 最长公共前缀


解题思路

方法一:横向扫描

思路

我们需要统计字符串数组中所有字符串的公共前缀的最长字符。为此我们可以先统计字符串数组中前两个字符串的最长公共前缀,然后将得到的最长公共前缀字符串与第三个字符串在一起统计最长公共前缀…,如此循环下去,直到统计与最后一个字符串的最长公共前缀。

代码

class Solution {
public:string longestCommonPrefix(vector<string>& strs) {if (!strs.size()) {     // 特判return "";}string prefix = strs[0];int n = strs.size();for (int i = 1; i < n; ++i) {prefix = longestCommonPrefix(prefix, strs[i]);if (!prefix.size()) {   // 如果某个时刻得到的最长公共前缀为空,可以提前退出break;}}return prefix;}// longestCommonPrefix 重载函数,统计两个字符串的最长公共前缀string longestCommonPrefix(const string& str1, const string& str2) {int m = min(str2.size(), str2.size());int idx = 0;while (idx < m && str1[idx] == str2[idx]) {++idx;}return str1.substr(0, idx);}
};

复杂度分析

时间复杂度: O ( m n ) O(mn) O(mn) m m m 是字符串数组中字符串的平均长度, n n n 字符串数组的长度。

空间复杂度: O ( 1 ) O(1) O(1)

方法二:纵向扫描

思路

纵向扫描是比较容易想到的方法。纵向扫描时,从前往后遍历所有字符串的每一列,比较相同列上的字符是否相同,如果相同则继续对下一列进行比较,如果不相同则当前列不再属于公共前缀,当前列之前的部分为最长公共前缀。

代码

class Solution {
public:string longestCommonPrefix(vector<string>& strs) {if (!strs.size()) {     // 特判return "";}int n = strs[0].size();int m = strs.size();for (int i = 0; i < n; ++i) {char c = strs[0][i];for (int j = 1; j < m; ++j) {if (i == strs[j].size() || strs[j][i] != c) {return strs[0].substr(0, i);}}}return strs[0];}
};

复杂度分析

时间复杂度: O ( m n ) O(mn) O(mn) m m m 是字符串数组中字符串的平均长度, n n n 字符串数组的长度。

空间复杂度: O ( 1 ) O(1) O(1)

方法三:分治

思路

还可以利用分治的思想来解决本题。计算字符串数组的最长公共前缀,可以先计算前半部分字符串的最长公共前缀,再计算后半部分的最长公共前缀,最后计算这两部分最长公共前缀的公共前缀。对于前半部分和后半部分各自的最长公共前缀也可以通过先分再计算的方法。

具体实现见代码。

代码

class Solution {
public:string longestCommonPrefix(vector<string>& strs) {if (!strs.size()) {     // 特判return "";}return longestCommonPrefix(strs, 0, strs.size() - 1);}// longestCommonPrefix 的重载函数,分与调用计算公共前缀string longestCommonPrefix(const vector<string>& strs, int start, int end) {if (start == end) {return strs[start];}int mid = (start + end) / 2;string lcpLeft = longestCommonPrefix(strs, start, mid);string lcpRight = longestCommonPrefix(strs, mid + 1, end);return commonPrefix(lcpLeft, lcpRight);}// 计算两字符的公共前缀string commonPrefix(const string& str1, const string& str2) {int n = min(str1.size(), str2.size());for (int i = 0; i < n; ++i) {if (str1[i] != str2[i]) {return str2.substr(0, i);}}return str1.substr(0, n);}
};

复杂度分析

时间复杂度: O ( m n ) O(mn) O(mn) m m m 是字符串数组中字符串的平均长度, n n n 字符串数组的长度。时间复杂度的递推式为 T ( n ) = 2 ⋅ T ( n 2 ) + O ( m ) T(n) = 2 \cdot T(\frac{n}{2}) + O(m) T(n)=2T(2n)+O(m),计算得 T ( n ) = O ( m n ) T(n)=O(mn) T(n)=O(mn)

空间复杂度: O ( m l o g n ) O(mlogn) O(mlogn)


写在最后

如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。

最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx 四层和七层代理

四层&#xff1a;通过报文中的目标地址和端口&#xff0c;加上负载均衡设备设置的服务器选择方式&#xff0c;决定最终选择的内部服务器&#xff0c;使用tcp、udp协议。 七层&#xff1a;"内容交换"&#xff0c;通过报文中真正有意义的应用层内容&#xff0c;加上负…

多商家AI智能名片商城系统(开源版)——构建高效数字化商业新生态

一、项目概述 1、项目背景 1&#xff09;起源 随着数字化时代的快速发展&#xff0c;传统名片和商城系统已经难以满足企业日益增长的需求。商家需要更高效、更智能的方式来展示自己的产品和服务&#xff0c;与消费者进行互动和交易。同时&#xff0c;开源技术的普及也为开发…

ubuntu16安装docker及docker-compose

ubuntu16安装docker及docker-compose 一、环境前期准备 检查系统版本 系统版本最好在16及以上&#xff0c;可以确保系统的兼容性 lsb_release -a查看内核版本及系统架构 建议用 x86_64的系统架构&#xff0c;安装是比较顺利的 uname -a32的系统不支持docker&#xff0c;安…

【python进阶篇】装饰器(6)

在Python中&#xff0c;修饰器&#xff08;也称为装饰器&#xff09;是一个高级Python功能&#xff0c;它允许你修改或增强函数、方法或类的行为&#xff0c;而无需修改其源代码。修饰器本质上是一个接受函数作为参数的可调用对象&#xff08;通常是另一个函数&#xff09;&…

Spring-IOC之组件扫描

版本 Spring Framework 6.0.9​ 1. 前言 通过自动扫描&#xff0c;Spring 会自动从扫描指定的包及其子包下的所有类&#xff0c;并根据类上的特定注解将该类装配到容器中&#xff0c;而无需在 XML 配置文件或 Java 配置类中逐一声明每一个 Bean。 支持的注解 Spring 支持一系…

编程基础“四大件”

基础四大件包括&#xff1a;数据结构和算法,计算机网络,操作系统,设计模式 这跟学什么编程语言,后续从事什么编程方向均无关&#xff0c;只要做编程开发&#xff0c;这四个计算机基础就无法避开。可以这么说&#xff0c;这基础四大件真的比编程语言重要&#xff01;&#xff0…

(一)、SQL进阶——神奇的SQL

一、CASE表达式 1、CASE表达式概述 case表达式有简单case表达式和搜索case表达式两种写法 -- 简单case表达式 case sex when 1 then 男 when 0 then 女 else 其他 end -- 搜索case表达式 case when sex1 then 男 when sex1 then 男 else 其他 end 这两种写法执行的结…

操作系统原理与实验——实验九分页式存储

实验指南 运行环境&#xff1a; Dev c 算法思想&#xff1a; 本实验模拟分页存储管理&#xff0c;对于需要分配资源的作业&#xff0c;预先申请空间&#xff0c;内存空间满足要求&#xff0c;进行内存分配并插入作业链表&#xff0c;打印该作业页表信息与系统内存信息。对于需要…

【QT学习】9.绘图,三种贴图,贴图的转换

一。绘图的解释 Qt 中提供了强大的 2D 绘图系统&#xff0c;可以使用相同的 API 在屏幕和绘图设备上进行绘制&#xff0c;它主要基于QPainter、QPaintDevice 和 QPaintEngine 这三个类。 QPainter 用于执行绘图操作&#xff0c;其提供的 API 在 GUI 或 QImage、QOpenGLPaintDev…

路由引入实验

配置思路&#xff1a; 1.IP配置&#xff1a; [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip ad 100.1.1.1 24 [R1-GigabitEthernet0/0/0]int l0 [R1-LoopBack0]ip ad 192.168.0.1 32 [R1-LoopBack0]int l1 [R1-LoopBack1]ip ad 192.168.1.1 32 [R1-LoopBack1]q dis ip int bri…

海康Visionmaster-常见问题排查方法-启动阶段

VM试用版启动时&#xff0c;弹窗报错&#xff1a;加密狗未安装或检测异常&#xff1b;  问题原因&#xff1a;安装VM 的时候未选择软加密&#xff0c;选择了加密狗驱动&#xff0c;此时要使用软授权就出现了此现象。  解决方法&#xff1a; ① 首先确认软加密驱动正确安装…

XYCTF 部分wp及学习记录

1.ezmd5 根据题目提示 我们知道应该是要上传两张md5值相同的图片 根据原文链接&#xff1a;cryptanalysis - Are there two known strings which have the same MD5 hash value? - Cryptography Stack Exchange 把保存下来的图片上传一下 得到flag 2.ezhttp 根据原文链接&…

OpenStack云计算(十一)——OpenStack网络管理,验证OpenStack网络资源模型,验证来巩固和加深对OpenStack网络资源模型的理解

项目实训一 【实训题目】 验证OpenStack网络资源模型 【实训目的】 通过验证来巩固和加深对OpenStack网络资源模型的理解。 【实训准备】 &#xff08;1&#xff09;复习Neutron网络资源模型。 &#xff08;2&#xff09;重点理解网络、子网、端口和路由器的概念。 【实…

SOTAX溶出测试系统PC触摸屏维修三部曲

SOTAX溶出测试系统作为一款广泛应用于制药行业的知名品牌&#xff0c;具有高精度、操作简便、稳定性好等特点。它适用于各种类型的药品研发和生产环节&#xff0c;为科研人员提供可靠的数据支持。瑞士SOTAX溶出仪是实验室中常用的设备&#xff0c;其触摸屏是用户交互的重要界面…

【java毕业设计】 基于Spring Boot+mysql的免税商品优选购物商城设计与实现(程序源码)-免税商品优选购物商城

基于Spring Bootmysql的免税商品优选购物商城设计与实现&#xff08;程序源码毕业论文&#xff09; 大家好&#xff0c;今天给大家介绍基于Spring Bootmysql的免税商品优选购物商城设计与实现&#xff0c;本论文只截取部分文章重点&#xff0c;文章末尾附有本毕业设计完整源码及…

Mysql学习一

目录 1.启动数据库&#xff1a; 2.命令行连接到MySQL&#xff08;winr输入cmd&#xff09; 3.MySQL的三重结构&#xff1a; 4.SQL语句分类&#xff1a; 1.启动数据库&#xff1a; winr——输入services.msc进入本地服务 2.命令行连接到MySQL&#xff08;winr输入cmd&#x…

数据结构-树和森林之间的转化

从树的二叉链表的定义可知&#xff0c;任何一棵和树对应的二叉树&#xff0c;其根节点的右子树必为空。这里我们举三个树&#xff0c;将这个由三个树组成的森林组成二叉树是这个样子的。 下面我们说明一下详细过程&#xff0c;首先将每个树转化为二叉的状态&#xff0c;如图所示…

[激光原理与应用-89]:激光器产品性能指标参数详解

目录 示例&#xff1a;大量能纳秒激光器 示例2&#xff1a;中等能量纳秒激光器 1、中心波长Wavelength (nm) 351nm1nm 2、脉冲宽度 Pulse Width ~120ns 1kHz 3、重复频率 Repitition Rate 1~10KHz 4、行频 Line Frequency 50 to 60 Hz 5、单脉冲能量 Pulse …

逆向修改app就可以游戏充值到账?

hello ,大家好, 现在市场仍然流行着非常多的传奇类游戏私服或者其他类型的游戏私服,随着私服越来越多(很多并不合法),越来越多的人加入了破解,逆向修改,或者代充的队伍并从中获利。这里我给大家分享一下这些做代充的常规的做法,以及大家作为游戏服务器如何避坑做强校验…

在linux系统中启动pycharm

1.找到pycharm的安装路径&#xff0c;一般在下载文件夹中 2.进入pycharm的安装路径&#xff0c;进入bin目录 3.右击&#xff0c;打开终端&#xff0c;输入./pycharm.sh