面试经典算法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,一经查实,立即删除!

相关文章

ShardingSphere、雪花算法、分布式id生成器CosID概述

ShardingSphere 用处:sharding是分片的意思,sphere是球(生态的意思)。用来做分库分表的生态的。一个订单表太大,查询会很慢,要分表,分为3个表,这样查询会快一点,所以有了…

软件测试 - 自动化测试(概念)(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 …

SpringBoot文档之Profiles的阅读笔记

Reference Core Features Profiles 类似Maven的Profile特性&#xff0c;限定配置项取值的生效场景。 在代码中&#xff0c;对于使用注解Component、Configuration、ConfigurationProperties标记的类&#xff0c;可以增加Profile&#xff0c;限定前述类的生效场景。 类似如下样…

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

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

Spark大数据分析案例

目录 案例概述环境搭建1. Spark单机环境2. Spark集群环境 数据集数据预处理 Spark作业编写提交Spark作业 数据可视化可能遇到的问题及解决方法结论 案例概述 本案例将介绍如何在单机和集群环境下使用Apache Spark进行大数据分析&#xff0c;最终使用Python实现数据的可视化。我…

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

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

32-hashmap linkedmap treemap 的区别

‌HashMap‌、‌LinkedHashMap‌和‌TreeMap‌是Java中三种常用的Map实现&#xff0c;它们在数据结构、有序性、性能和线程安全性等方面有所不同。 ‌数据结构‌&#xff1a; ‌HashMap‌&#xff1a;基于哈希表数据结构实现&#xff0c;通过计算键的哈希值来确定存储位置。它不…

ptrade排坑日记——定时任务执行后,文件权限会变化。

前言 今天要和大家分享的是使用ptrade的定时任务过后&#xff0c;执行的时候&#xff0c;文件权限会发生变化&#xff01; 一、问题描述 定时任务执行后&#xff0c; /home/fly/data/fundamentals_daily/all.pickle、/home/fly/data/valuation_new/all.pickle 文件权限会从…

(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…

实现一个自定义STL类模版DataStorage

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 参考&#xff1a;https://tool.oschina.net/uploads/apidocs/cpp/en/cpp/container/vector.html 参考&#xff1a;https://tool.oschina.net/uploads/apidocs/cpp/en/cpp/iterator/reverse_iterator.html 参考&#xff1a…

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

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

[Sqlserver][索引]SQL Server 索引概述

SQL Server 索引概述 索引简介 目的&#xff1a;提升SQL Server性能&#xff0c;加快查询速度&#xff0c;减少响应时间。限制&#xff1a;合理使用索引&#xff0c;避免过多索引影响数据更新操作和浪费硬盘空间。 索引分类 唯一索引 (UNIQUE)&#xff1a;确保索引值唯一。…

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

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

源码阅读入门:以ArrayList为例

阅读源码是提升编程技能的重要方法。以Java集合框架中的ArrayList为例,引导如何有效地阅读和理解源码。 第一步&#xff1a;选择合适的源码 选择合适的源码是成功的第一步。对于初学者来说&#xff0c;可以从简单的类开始&#xff0c;比如String、ArrayList或者HashMap。 第二…