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

news2024/9/19 22:12:25

最长公共前缀

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

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

示例 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开头,缩短prefix
                prefix = 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.coloradmin.cn/o/2056053.html

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

相关文章

数据库学习(进阶)

数据库学习(进阶) Mysql结构:连接层:服务层(核心层):存储引擎层:系统文件层: 存储引擎(概述):存储引擎特点:InnoDB存储引擎:(为并发条…

c++顺序表初始(vector)

前言 std是一个容器和算法相关的库,顺序表作为一个常见的容器也在标准库中有相应的实现--vector。今天我们就来简单的认识一下vector的使用,并且简单的模拟实现一个我们的vector 具体vector类的描述可以参考vector - C Reference (cplusplus.com) 在不…

八股之 Java 常用框架

一、Spring 1.IOC 1.将一个类声明为 Bean 的注解有哪些? Component:通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用Component 注解标注。Repository : 对应持久层即 Dao 层,主要用于数据库…

【网络 day1】

服务器可以循环接收客户端的数据;当客户端退出后, 服务器阻塞等待下一个客户端的连接,而后继续通信;当有客户端连接时, 服务器端 打印客户端的IP 和 Port信息;将代码的 send 和 recv 改为 write 和 read&am…

2024年5款值得推荐的图表数据可视化工具推荐,不会Excel做表必备!

只推荐5个数据可视化图表制作网站,保证让你相见恨晚! 模板类型全、数量丰富,支持在线编辑,还免费~~ 1、Dycharts 推荐指数:☆☆☆☆☆ 网址:dycharts.com 这是一个功能强大且免费的在线数据可视化制作工…

产品分析 | 便利蜂

​产品信息 产品名称:便利蜂 Slogan:小小的幸福 在你身边 版本号:V1.11.3 大小:23.6M 体验环境:Android6.0.1 品牌概述 便利蜂成立于2016年12月,算是起步较早的企业了,17年2月就开了第一家…

记录一次edu web端渗透测试实录

0x01前言 由于是直接接到的相关需求,所以是针对性的一次渗透测试,以下内容仅仅作为思路分享以及打法扩展 0x02 进后台小妙招 弱口令永远是永恒不变的0day漏洞,这也是我们挖漏洞时的敲门砖,以下给出的是一个很神奇的关于寻找后台…

看 逆行人生

电影和我的职业本身有相关性,而且我特别喜欢徐峥执导的电影,这次的题材也算是碰上自己的胃口。 周六,下了大半天的雨,早上驱车到公司加班,下午六点多到时候特别想去看电影,果断再驱车从公司赶回来&#xff…

excel计算时间差-显示每堂课时间

TEXT(H2 - INDEX($H$2:$H$1000, MATCH(B2, $B$2:$B$1000, 0)), "mm:ss")import pandas as pd# 假设你已经加载了数据 df pd.read_excel(你的文件路径.xlsx)# 将开始时间列转换为datetime类型 df[开始时间] pd.to_datetime(df[开始时间])# 计算每个课堂号组内的时间…

批发供应系统:提升效率与竞争力的关键

在当今复杂多变的商业环境中,批发供应系统作为连接生产商、分销商与零售商的重要纽带,其效率与智能化水平直接决定了供应链的运作效率与市场竞争力。随着信息技术的飞速发展,尤其是大数据、云计算、人工智能(AI)及物联…

Python基础—数据分析中的可视化技巧

数据分析中的可视化技巧是帮助我们将复杂的数据转化为直观、易于理解的图表和图像的过程。这些技巧不仅有助于发现数据中的模式和趋势,还能增强数据故事的讲述能力。以下是一些常用的数据可视化技巧,以及相应的Python代码示例(使用matplotlib…

Diffusion Model相关论文整理(二)

目录 1、AnoDDPM: Anomaly Detection With Denoising Diffusion Probabilistic Models Using Simplex Noise [CVPR Workshop 2022]2、Unsupervised Visual Defect Detection with Score-Based Generative Model[2022]3、DiffusionAD: Denoising Diffusion for Anomaly Detectio…

接口自动化-代码实现

接口自动化基础 1、接口自动化测试 接口自动化:使用工具或代码代替人对接口进行测试的技术测试目的: 防止开发修改代码时引入新的问题测试时机: 开发进行系统测试转测前,可以先进行接口自动化脚本的编写开发进行系统测试转测后&…

Tensorflow实现深度学习案例7:咖啡豆识别

本文为为🔗365天深度学习训练营内部文章 原作者:K同学啊 一、前期工作 1. 导入数据 from tensorflow import keras from tensorflow.keras import layers,models import numpy as np import matplotlib.pyplot as plt import os,PIL,p…

地平线旭日X3开发板--图像获取时间戳问题

需求 需要获得图像接收完成后的帧时间戳。 sensor f37, MIPI 通信 问题 按我的了解,一般是在内核中产生MIPI数据接收完成中断并打印时间戳, 一般是CLOCK_MONOTONIC方式的时间 , X3无法获得MIPI数据接收完成的时间戳。 X3平台HB_VIN_GetC…

4 - Linux远程访问及控制

目录 一、SSH远程管理 1. SSH概述 2.SSH的优点 3.配置OpenSSH客户端 4.sshd服务支持的两种验证方式 5. 使用SSH客户端程序 5.1 ssh - 远程登录 5.2 scp - 远程复制 6.配置密钥对验证 二、TCP Wrappers访问控制 1.TCP Wrappers 概述 2. TCP Wrappers 机制的基本原则 …

MS SQL Server partition by 函数实战二 编排考场人员

目录 需求 输出效果 范例运行环境 表及视图样本设计 功能实现 生成考场数据 生成重复的SQL语句 封装为统计视图 编写存储过程实现统计 小结 需求 假设有若干已分配准考证号的考生,准考证号示例(01010001)共计8位,前4位…

ZeroEA阅读笔记

ZeroEA阅读笔记 摘要 实体对齐(EA)是知识图(KG)研究中的一项关键任务,旨在识别不同知识图谱中的等效实体,以支持知识图谱集成、文本到SQL和问答系统等下游任务。考虑到KG中丰富的语义信息,预训练语言模型(PLM)凭借其卓越的上下文感知编码功…

使用SSMS操作AdventureWorks 示例数据库

简介 AdventureWorks 示例数据库,官方文档:https://learn.microsoft.com/zh-cn/sql/samples/adventureworks-install-configure?viewsql-server-ver16&tabsssms 下载备份文件 OLTP 数据适用于大多数典型的联机事务处理工作负载。数据仓库 (DW) 数据…

网络设备监控工具 PIGOSS BSM 网络设备-Ruijie设备SNMP配置及监控

目录 1. 全局模式 2. 配置SNMP V2 3. 配置SNMP V3 4. 配置SNMP Trap 5. 保存配置 6. 查看配置结果 7. 锐捷设备监控 1. 全局模式 SNMP 的配置工作在网络设备的全局配置模式下完成,在进行SNMP 配置前,请先进入全局配置模式。 Ruijie>enable …