【算法篇】求最长公共前缀JavaScript版本
题目描述
给你一个大小为 n 的字符串数组 strs ,其中包含n个字符串 , 编写一个函数来查找字符串数组中的最长公共前缀,返回这个公共前缀。
数据范围:
数据范围:0<n<5000,0<len(strsi)< 5000
进阶:空间复杂度 O(1),时间复杂度 O(n*len)
示例1
输入:[“abca”,“abc”,“abca”,“abc”,“abcc”]
返回值:“abc”
示例2
输入:[“abc”]
返回值:“abc”
解题思路
方法一:水平扫描法
-
初始化:首先检查输入数组是否为空,如果为空则直接返回空字符串。如果只有一个字符串,则返回该字符串本身,因为这时最长公共前缀就是这个字符串。
-
迭代比较:将第一个字符串作为初始的最长公共前缀。然后遍历数组中的其他字符串,对每个字符串使用
indexOf
方法检查当前公共前缀是否存在于该字符串中。 -
缩短当前公共前缀:如果发现当前公共前缀不在某个字符串中,就将公共前缀缩短一个字符,再次检查。这个过程一直持续到找到所有字符串共有的前缀或者为空字符串。
-
返回结果:最后返回找到的最长公共前缀。
方法一JavaScript版本代码如下:
function longestCommonPrefix(strs) {// 如果数组为空,直接返回空字符串if (strs.length === 0) return "";// 如果数组只有一个元素,返回该元素本身if (strs.length === 1) return strs[0];// 初始化最长公共前缀为第一个字符串let prefix = strs[0];// 遍历数组中的每个字符串,从第二个开始for (let i = 1; i < strs.length; i++) {// 当前字符串与前缀不匹配时,缩短当前前缀while (strs[i].indexOf(prefix) !== 0) {// 缩短前缀字符串prefix = prefix.substring(0, prefix.length - 1);// 如果前缀为空,说明没有公共前缀,返回空字符串if (prefix === "") return "";}// 当前字符串匹配前缀,继续检查下一个字符串}// 返回找到的最长公共前缀return prefix;
}// 示例
console.log(longestCommonPrefix(["abca", "abc", "abca", "abc", "abcc"])); // "abc"
console.log(longestCommonPrefix(["abc"])); // "abc"
方法二:垂直扫描法
-
初始化:同样检查输入数组是否为空,如果为空则直接返回空字符串。
-
逐列比较:遍历第一个字符串的每个字符,将这些字符与其他字符串在相同位置的字符进行比较。
-
构建公共前缀:如果在某个位置所有字符串的字符都相同,则将该字符添加到公共前缀中。如果在某个位置发现字符不匹配或某个字符串长度不足,则停止比较并返回当前的公共前缀。
-
返回结果:最后返回构建好的最长公共前缀。
方法二JavaScript版本代码如下:
function longestCommonPrefix(strs) {// 如果数组为空,直接返回空字符串if (strs.length === 0) return "";// 初始化最长公共前缀为空字符串let prefix = "";// 遍历第一个字符串的每个字符for (let j = 0; j < strs[0].length; j++) {// 获取第一个字符串的当前字符const char = strs[0][j];// 遍历数组中的其他字符串for (let i = 1; i < strs.length; i++) {// 如果当前字符不在其他字符串的相同位置,或者当前字符串长度不足if (j >= strs[i].length || strs[i][j] !== char) {// 没有公共前缀,返回当前已找到的公共前缀return prefix;}}// 如果所有字符串在当前位置都有相同的字符,将该字符添加到公共前缀prefix += char;}// 返回找到的最长公共前缀return prefix;
}// 示例
console.log(longestCommonPrefix(["abca", "abc", "abca", "abc", "abcc"])); // "abc"
console.log(longestCommonPrefix(["abc"])); // "abc"
相同测试用例方法一和方法二的运行效果对比如下图,可看出两个方法占用内存差不太多,但方法二的运行时间比方法一更高效一些。
总结与类似题解题思路
以上两个方法都实现了寻找字符串数组中最长公共前缀的功能。方法一通过逐个字符串进行水平扫描来缩短前缀,而方法二通过逐字符垂直扫描来构建前缀。两种方法都有其适用场景,但方法二在时间和空间复杂度上通常更优。
对于求解最长公共前缀这类问题,核心思路是逐步缩小问题的规模,直到找到所有字符串共有的前缀或者确定没有公共前缀为止。具体实现时,可以采用以下策略:
-
初始化:总是先检查输入数组是否为空或只有一个元素,这些情况下可以直接返回相应结果。
-
迭代或递归:通过迭代或递归的方式,逐步缩小问题的规模。在迭代中,可以通过缩短当前公共前缀(水平扫描法)或逐列比较字符(垂直扫描法)来实现。
-
比较与更新:在每一步中,都需要比较当前公共前缀与新的字符串或字符,根据比较结果更新公共前缀。
-
结束条件:当发现公共前缀为空或者已经比较到某个字符串的末尾时,就可以停止进一步的搜索,并返回当前的公共前缀。
对于类似的题目,比如求多个区间的交集、求多个数组的交集等,都可以采用类似的思路:逐步缩小问题的规模,通过比较和更新来找到共有部分,直到无法再找到共有部分为止。这种思路的关键在于找到合适的数据结构和方法来高效地进行比较和更新操作。
相关文章:

【算法篇】求最长公共前缀JavaScript版本
题目描述 给你一个大小为 n 的字符串数组 strs ,其中包含n个字符串 , 编写一个函数来查找字符串数组中的最长公共前缀,返回这个公共前缀。 数据范围: 数据范围:0<n<5000,0<len(strsi)< 5000 进阶:空间复杂度 O(1)&a…...

搭建RocketMQ主从异步集群
搭建RocketMQ主从异步集群 1、RocketMQ集群模式 为了追求更好的性能,RocketMQ的最佳实践方式都是在集群模式下完成的。RocketMQ官方提供了三种集群搭建方式: 2主2从异步通信方式:使用异步方式进行主从之间的数据复制。吞吐量大,…...
最大子段和问题
最大子段和问题 分数 15 全屏浏览 切换布局 作者 王东 单位 贵州师范学院 最大子段和问题。给定由n个整数组成的序列,求序列中子段的最大和,若所有整数均为负整数时定义最大子段和为0。 输入格式: 第一行输入整数个数n(1≤n≤1000&…...

Vue3中的常见组件通信之mitt
Vue3中的常见组件通信之mitt 概述 在vue3中常见的组件通信有props、mitt、v-model、 r e f s 、 refs、 refs、parent、provide、inject、pinia、slot等。不同的组件关系用不同的传递方式。常见的撘配形式如下表所示。 组件关系传递方式父传子1. props2. v-model3. $refs…...

MySQL快速入门(极简)
SQL 介绍及 MySQL 安装 一、实验简介 本课程为实验楼提供的 MySQL 实验教程,所有的步骤都在实验楼在线实验环境中完成,学习中请按照实验步骤依次操作。 本课程为 SQL 基本语法及 MySQL 基本操作的实验,理论内容较少,动手实践多…...
CentOS7安装NVIDIA显卡驱动指引【笔记】
CentOS7安装NVIDIA显卡驱动指引【笔记】 实践设备:华硕FX-PRO(NVIDIA GeForce GTX 960M) 环境准备: 1、将系统安装到设备上正常运行; 2、设备网络调试,可以正常访问外网; 3、配置ssh服务(非必要,根据实际情况)。 说明: 本文档所提供的指引和参考主要基于特定实践…...

【RabbitMQ】RabbitMQ配置与交换机学习
【RabbitMQ】RabbitMQ配置与交换机学习 文章目录 【RabbitMQ】RabbitMQ配置与交换机学习简介安装和部署1. 安装RabbitMQ2.创建virtual-host3. 添加依赖4.修改配置文件 WorkQueues模型1.编写消息发送测试类2.编写消息接收(监听)类3. 实现能者多劳 交换机F…...
常见排序算法,快排,希尔,归并,堆排
后面的排序中都要用到的函数 //交换 void Swap(int* p1, int* p2) {int* tmp *p1;*p1 *p2;*p2 tmp; } 包含的头文件 "Sort.h" #pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<time.h> #include<s…...
语法的时态1——一般现在时(1)
定义:一般现在时用来表示经常发生的动作,以及客观事实。 一般现在时的构成以及标志词 1.一般现在时的结构 (1)主系表结构 构成:主语be(am,is,ear)其他。属于状态句。 I…...

JAVA:在IDEA引入本地jar包的方法并解决打包scope为system时发布无法打包进lib的方案
一.引入本地Jar包的步骤 有时maven依耐的包是本地的jar包,此时需要进行以下步骤设置。 步骤1.在pom.xml中添加插件设置,将system范围包含进来,此设置是为了在打包时,本地jar包自动生成到部署包里。(若无法打进包,请参考下文的方…...

Hadoop3:MapReduce源码解读之Map阶段的CombineFileInputFormat切片机制(4)
Job那块的断点代码截图省略,直接进入切片逻辑 参考:Hadoop3:MapReduce源码解读之Map阶段的Job任务提交流程(1) 6、CombineFileInputFormat原理解析 类的继承关系 与TextInputFormat切片机制的区别 框架默认的TextI…...
GPT-4o:OpenAI的最新篇章与深度探索
引言: 在人工智能领域,自然语言处理(NLP)技术持续引领着技术创新的步伐。自2023年引入以来,GPT系列模型一直以其卓越的语言生成能力而闻名,近期的迭代——GPT-4o,更是为这一领域的研究和应用带…...

OpenGauss数据库-5.数据更新
第1关:插入数据 gsql -d postgres -U gaussdb -W "passwd123123" create table student (id integer primary key,name char(20),age integer ); insert into student values(1,"lily",20),(2,lily,21),(3,marry,19); 第2关:删除数…...
【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 机场航班调度程序(100分) - 三语言AC题解(Python/Java/Cpp)
🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 🌍 评测功能需要订阅专栏后私信联系清隆解锁~ 文章目录 …...

Spark作业运行异常慢的问题定位和分析思路
一直很慢 🐢 运行中状态、卡住了,可以从以下两种方式入手: 如果 Spark UI 上,有正在运行的 Job/Stage/Task,看 Executor 相关信息就好。💻 第一步,如果发现卡住了,直接找到对应的…...

音视频转为文字SuperVoiceToText
音视频转为文字SuperVoiceToText,它能够把视频或语音文件高效地转换为文字,它是基于最为先进的 AI 大模型,通过在海量语音资料上进行训练学习而造就,具备极为卓越的识别准确率。 不仅如此,它支持包括汉语、英语、日语…...

Python基础教程(九):Lambda 函数
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝Ὁ…...

docker从入门到精通
一、Docker基本命令 1. Docker的常用命令 帮助命令 docker version # docker版本信息 docker info # 系统级别的信息,包括镜像和容器的数量 docker 命令 --help 帮助文档 镜像命令 docker images 查看所有本地主机上的镜像 [rootiZ2zeg4ytp0whqtmxbsqiiZ…...
介绍工厂模式
简单工程 public class SingleFactoryTest {public static void main(String[] args) {SingleFactory factory new SingleFactory();Product productA factory.getObject("1");productA.method();Product productB factory.getObject("2");productB.me…...
大数据领域的workload是什么意思?
什么是workload? 在大数据领域,"workload"指的是需要处理的数据集和对其执行的操作的组合。它描述了大数据系统需要执行的任务的类型和规模。 我们可以从以下几个维度来理解大数据领域的 workload: 数据的特征: 数据量 需要处…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...