面试经典算法150题系列-最长公共前缀

最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

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

示例 1:

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

示例 2:

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

实现思路:

本题是为了求一个字符串数组的最长公共前缀,我们可以试着让第一个字符串,作为公共前缀字符串,与其他的字符串进行比对,如果公共前缀的字符在与其他字符串字符不同时,则缩减前缀字符串,缩减为0时,则返回空字符串。

注意,我这里的判断条件是,当前前缀字符串的字符与比对的字符是否相同,不同时做处理,相同时则不做处理。

实现代码:

public String longestCommonPrefix(String[] strs) {if (strs == null || strs.length == 0) {return "";}// 取数组的第一个字符串作为初始的最长公共前缀String prefix = strs[0];// 遍历字符串数组for (String str : strs) {while (!str.startsWith(prefix)) {// 如果当前字符串不以prefix开头,缩短prefixprefix = prefix.substring(0, prefix.length() - 1);// 如果缩短到空字符串,直接返回if (prefix.isEmpty()) {return "";}}}return prefix;}

思路模拟详解:

  1. 检查空数组或null:

    • 如果 strs 是 null 或者长度为0,直接返回空字符串 ""
  2. 初始化前缀:

    • 选择数组的第一个元素 strs[0] 作为初始的最长公共前缀 prefix
  3. 遍历数组:

    • 使用增强型for循环遍历数组 strs 中的每个字符串 str
  4. 检查公共前缀:

    • 对于数组中的每个字符串 str,使用 startsWith 方法检查它是否以当前的 prefix 作为前缀。
  5. 更新前缀:

    • 如果 str 不以 prefix 开头,说明 prefix 太长了。使用 substring 方法缩短 prefix,去掉最后一个字符,然后再次检查。
    • 这个过程会一直重复,直到 prefix 缩短到所有字符串都以它为前缀,或者 prefix 为空。
  6. 结束条件:

    • 如果在任何时候 prefix 被缩短到空字符串,说明数组中的字符串没有公共前缀,此时直接返回 ""
  7. 返回结果:

    • 循环结束后,prefix 就是所有字符串的最长公共前缀,返回这个值。

示例1模拟

  • 输入:strs = {"flower", "flow", "flight"}
  • 初始化 prefix 为 "flower"
  • 第一轮for循环:prefix(flower)等于flower,结束循环
  • 第二轮for循环:prefix(" flower ")不等于" flow " ,进入while循环,prefix缩减一个字符            ,更新prefix为" flowe ",进行第二轮while循环判断,prefix(" flowe ")不等于" flow ",缩减一个字符,prefix更新为flow。再一次进行while判断,prefix(" flow ")等于flow,循环结束。
  • 第三轮for循环,重复上述第二轮的过程,得到公共字符串" fl "。
  • 返回 prefix,即 "fl"

这里用到了String类的几个方法,下面进行补充,忘记的朋友可以进行复习。

1.startsWith

startsWithString 类的一个方法,用于检查字符串是否以指定的前缀开始。如果调用对象(即 this 字符串)从开头开始就是按照指定的字符串(前缀)顺序出现的,那么返回 true;否则返回 false

以下是 startsWith 方法的一些关键点:

  • 方法签名public boolean startsWith(String prefix)
  • 参数prefix 是一个 String 类型的参数,表示要检查的前缀。
  • 返回值:返回一个 boolean 值,如果调用对象以指定的前缀开始,则返回 true,否则返回 false
  • 异常:如果参数 prefix 是 null,则抛出 NullPointerException

startsWith 方法有几个重载版本,允许你指定额外的参数来控制比较的开始位置和长度:

  • startsWith(String prefix):检查整个字符串是否以指定的前缀开始。
  • startsWith(String prefix, int toffset):从指定的位置 toffset 开始检查字符串,看它是否以指定的前缀开始。

2.substring

substringString 类的一个方法,用于返回字符串的一个子部分,即子字符串。你可以指定一个或两个参数来确定要提取的子字符串的起始位置和结束位置(不包括结束位置的字符)。

以下是 substring 方法的一些关键点:

  • 方法签名

    • public String substring(int beginIndex):返回从 beginIndex 位置开始到原字符串末尾的子字符串。
    • public String substring(int beginIndex, int endIndex):返回从 beginIndex 位置开始到 endIndex 前一个位置的子字符串。
  • 参数

    • beginIndex:子字符串的起始位置(包含该位置的字符)。
    • endIndex:子字符串的结束位置(不包含该位置的字符)。
  • 返回值:返回一个新的 String 对象,包含提取的子字符串。

  • 异常

    • 如果 beginIndex 小于 0 或大于字符串的长度,抛出 StringIndexOutOfBoundsException
    • 如果 beginIndex 大于 endIndex,抛出 StringIndexOutOfBoundsException

3.增强for循环

在Java中,for (String str : strs) 是一个增强型for循环(也称为for-each循环),用于遍历字符串数组 strs 中的每个元素。这种循环结构使得遍历数组和集合变得更加简洁和易于阅读。

以下是对这种循环用法的详细说明:

  • for:这是Java中的循环关键字,用于开始一个for循环。
  • (String str):这是循环中变量的声明部分。在每次迭代中,str 都会被赋值为数组中的当前元素。这里的 String 表示数组元素的类型。
  • ::这个冒号与前面的变量声明一起,用于指明这是一个增强型for循环。
  • strs:这是要遍历的数组或集合。在这个例子中,strs 是一个字符串数组。
  • System.out.println(str):这是循环体,用于执行一些操作。在这个例子中,它将打印出数组中的每个字符串。

示例代码

String[] strs = {"apple", "banana", "cherry"}; // 遍历字符串数组for (String str : strs) 
{System.out.println(str);}

这段代码将输出:

apple

banana

cherry

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

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

相关文章

软件测试 - 自动化测试(概念)(Java)(自动化测试分类、web自动化测试、驱动、selenium自动化测试工具的安装)

一、自动化的概念 ⾃动洒⽔机,主要通上⽔就可以⾃动化洒⽔并且可以⾃动的旋转。 ⾃动洗⼿液,免去了⼿动挤压可以⾃动感应出洗⼿液 超市⾃动闸⻔,不需要⼿动的开⻔关⻔ ⽣活中的⾃动化案例有效的减少了⼈⼒的消耗,同时也提⾼了⽣…

C语言程序设计(初识C语言后部分)

代码是一门艺术&#xff0c;键盘是我的画笔。 3.递归和迭代&#xff08;循环就是一种迭代&#xff0c;迭代不仅仅是循环&#xff09; 求n&#xff01; 递归方式&#xff1a; n!---> 1 (n1); n*(n-1)! (n>1) #include <stdio.h> //n!-->递归方式 int fac(in…

Kafka运行机制(一):Kafka集群启动,controller选举,生产消费流程

前置知识 Kafka基本概念https://blog.csdn.net/dxh9231028/article/details/141270920?spm1001.2014.3001.5501 1. Kafka集群启动 Kafka在启动集群中的各个broker时&#xff0c;broker会向controller注册自己&#xff0c;并且从controller节点同步集群元数据。 broker是Kaf…

C++入门——16C++11新特性

1.列表初始化 初始化列表时&#xff0c;可添加等号()&#xff0c;也可不添加。 struct Point {int _x;int _y; };int main() {int x1 1;int x2{ 2 };int array1[]{ 1, 2, 3, 4, 5 };int array2[5]{ 0 };Point p{ 1, 2 };// C11中列表初始化也可以适用于new表达式中int* pa …

jstack结果提取特定线程池线程的堆栈

这里假设你已经知道如何定位java进程PID&#xff0c;以及如何执行jstack命令进行导出&#xff0c;下面仅提供相关命令&#xff0c;及示例 ps aux|grep java jstack 8229 > jstack_output.log v1版本 grep second jstack_output.log 如果此时我们想重点关注一下下面这个线程…

高性价比全屋智能家居解决方案,提升生活幸福感!

在快节奏的城市生活中&#xff0c;公司、住宅两点一线的上班族不在少数。近年来&#xff0c;随着物联网、大数据技术的不断发展与5G的广泛普及&#xff0c;生活品质的提升成为上班族新的关注焦点。忙碌的工作时间结束后&#xff0c;智慧家居系统打造便捷、安全、智能、舒适的居…

(javaweb)SpringBootWeb案例(毕业设计)案例--部门管理

目录 1.准备工作 2.部门管理--查询功能 3.前后端联调 3.部门管理--新增功能 1.准备工作 mapper数据访问层相当于dao层 根据页面原型和需求分析出接口文档--前后端必须遵循这种规范 大部分情况下 接口文档由后端人员来编写 前后端进行交互基于restful风格接口 http的请求方式…

文书智能助手

背景 司法、医疗等行业存在着大量的文书&#xff0c;一份文书或者卷宗少则几十页&#xff0c;多则几万页。在查看和检查这些文书时&#xff0c;会遇到大量的信息。当需要查询进一步的详细内容时&#xff0c;往往需要选择一下文字&#xff0c;然后再在各种系统中 查询详细的信息…

日拱一卒(4)——leetcode学习记录:路径总和

一、任务&#xff1a; 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 叶…

二叉树(四)

一、二叉树的性质 二、练习 1.某二叉树共有399个节点&#xff0c;其中有199个度为2的节点&#xff0c;则二叉树中的叶子节点数为&#xff08; &#xff09;。 A.不存在这样的树 B.200 C.198 D.199 答案&#xff1a;B 参考二叉树的性质第三条 2.在具有2…

【Hadoop】核心组件深度剖析:HDFS、YARN与MapReduce的奥秘

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《大数据前沿&#xff1a;技术与应用并进》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Hadoop简介 2、Hadoop生态系统概览 二、Hadoo…

如何做萤石开放平台的物联网卡定向?

除了用萤石自带的4G卡外&#xff0c;我们也可以自己去电信、移动和联通办物联网卡连接萤石云平台。 1、说在前面 注意&#xff1a;以下流程必须全部走完&#xff0c;卡放在设备上才能连接到萤石云平台。 2、大致流程 登录官网→下载协议→盖章&#xff08;包括骑缝章&#…

多平台编译libexif

下载地址&#xff1a;https://github.com/libexif/libexif/releases 1. ubuntu x64 &#xff08;银河麒麟系统aarch64步骤相同&#xff09; # 解压 > tar -jxvf libexif-0.6.24.tar.bz2 > cd libexif-0.6.24 # 配置 > ./configure # 编译 > make # 安装 > mak…

【C++】String类:标准库介绍

目录 一.预备知识 1.auto关键字 2.范围for 3.迭代器 二.标准库里的string 1.string类的基本介绍 2.构造函数 ​编辑 3.访问及遍历操作 3.1 operator [] 3.2 基于范围for 3.3 使用迭代器 4.迭代器 5.容量操作 5.1 size和length 5.2 capacity 5.3 reserve和resiz…

备考2024年美国数学竞赛AMC10:吃透1250道真题和知识点(持续)

有什么含金量比较高的初中生数学竞赛吗&#xff1f;美国数学竞赛AMC10是个不错的选择。那么&#xff0c;如何备考AMC10美国数学竞赛呢&#xff1f;做真题&#xff0c;吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。 通过做真题&#xff0c;可以帮助孩子找到真实竞赛…

Python使用Selenium进行Web自动化测试详解

目录 引言 一、Selenium简介 Selenium的核心组件 二、环境搭建 1. 安装Python 2. 安装Selenium库 3. 下载并配置浏览器驱动 三、基础用法 1. 启动浏览器 2. 定位页面元素 3. 元素操作 4. 等待元素加载 1. 测试目的 2. 测试步骤与代码实现 3. 注意事项 结论 引言…

ViT笔记学习

1.VIT ViT原理讲解 ViT结合代码 1.3 ViT模型架构 我们先结合下面的动图来粗略地分析一下ViT的工作流程&#xff0c;如下&#xff1a; 将一张图片分成patches将patches铺平将铺平后的patches的线性映射到更低维的空间添加位置embedding编码信息将图像序列数据送入标准Transfor…

labview经验分享1-任意16进制字符类型匹配

系列文章目录 1、任意16进制字符类型匹配 文章目录 系列文章目录问题导入实现任意16进制字符类型匹配在这里插入图片描述 总结 问题导入 labveiw的字符串匹配&#xff0c;使用的是正则表达式&#xff0c;可以让我们很方便的对字符串进行字符处理操作。 但是某些情况下&#…

【python】Python实现XGBoost算法的详细理论讲解与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

encoding with ‘idna‘ codec failed (UnicodeError: label empty or too long)

今天在使用Flask连接mysql的时候&#xff0c;遇到了一个报错&#xff1a;encoding with ‘idna’ codec failed (UnicodeError: label empty or too long) 网上查了一下说是字符集的问题&#xff0c;然后尝试修改了一下字符集&#xff0c;结果还是不行。 最后去翻阅SQLAlchemy…