面试经典算法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.rhkb.cn/news/404306.html

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

相关文章

HTML及CSS面试题4

1、BFC 1.1、介绍BFC及其应用 补充——触发BFC的方式,常见的有: 设置浮动overflow设置为:auto、scroll、hiddenpositon设置为:absolute、fixed 介绍: ○ 所谓BFC,指的是:一个独立的布局环境&am…

集合的知识点

一、集合的简介 1.1 什么是集合 集合(Collection),也是一个数据容器,类似于数组,但是和数组是不一样的。集合是一个可变的容器,可以随时向集合集合中添加元素,也可以随时从集合中删除元素。另外,集合还提…

鸿蒙(API 12 Beta3版)【录像流二次处理(C/C++)】媒体相机开发指导

通过ImageReceiver创建录像输出,获取录像流实时数据,以供后续进行图像二次处理,比如应用可以对其添加滤镜算法等。 开发步骤 导入NDK接口,接口中提供了相机相关的属性和方法,导入方法如下。 // 导入NDK接口头文件#in…

使用python实现3D聚类图

实验记录,在做XX得分预测的实验中,做了一个基于Python的3D聚类图,水平有限,仅供参考。 一、以实现三个类别聚类为例 代码: import pandas as pd import numpy as np from sklearn.decomposition import PCA from sk…

开源版最新LoveCardsV2表白墙源码下载

源码亮点 模板系统,给你无限可能 卡片不限字数,支持多图片上传 支持评论,点赞,让互动性拉满 管理后台可添加多个管理员 卡片一键分享至多平台 卡片浏览次数统计 发行版开箱即用 部署教程 1. 环境(参考开发环境&…

XSS- DOMclobbering与svg深度利用

目录 源码展示 解法一&#xff1a;绕过过滤-DOM clobbering 什么是DOM clobbering DOM clobbering原理 全局变量自动创建 属性名冲突 影响脚本执行 逐过程分析 源码展示 <script>const data decodeURIComponent(location.hash.substr(1));;const root documen…

图像处理之:Video Processing Subsystem(三)

免责声明&#xff1a; 本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下&#xff0c;作者不对因使用本文内容而导致的任何直接或间接损失承担责任&#xff0c;包括但不限于数据丢失、业务中断或其他经济…

【硬件模块】震动传感器模块

震动传感器模块实物图 DO&#xff1a;数字信号量输出&#xff0c;接单片机管脚&#xff1b; AO&#xff1a;模拟输出&#xff0c;无效&#xff0c;一般不接。 无震动&#xff0c;DO输出高电平&#xff0c;信号指示灯灭&#xff1b; 有震动&#xff0c;DO输出低电平&#xff0c;…

DHCP的原理与配置

目录 DHCP的原理 DHCP是什么 DHCP的好处 DHCP的分配方式 DHCP的工作原理 DHCP的配置 环境设置 DHCP配置 验证配置是否成功 DHCP的原理 DHCP是什么 DHCP:Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议。由Internet工作小组开发&#xff0c;专门用…

牛客网习题——通过C++实现

一、目标 实现下面4道练习题增强C代码能力。 1.求123...n_牛客题霸_牛客网 (nowcoder.com) 2.计算日期到天数转换_牛客题霸_牛客网 (nowcoder.com) 3.日期差值_牛客题霸_牛客网 (nowcoder.com) 4.打印日期_牛客题霸_牛客网 (nowcoder.com) 二、对目标的实现 1.求123...n_…

【unity小技巧】下载原神模型,在Blender中PMX模型转FBX模型,导入到Unity中实现基于光照模型的内置和URP卡通渲染

最终效果 前言 最近在研究人物模型的使用和卡通渲染效果&#xff0c;这里我们就使用原神的模型来演示。 一、原神模型下载 原神的模型可以在官网直接下载到。 1、第一期模型 官网&#xff1a;https://ys.biligame.com/gczj/ 2、第二期模型 官网&#xff1a;http://ys.bi…

Axure高端交互元件库:助力产品与设计

用户体验&#xff08;UX&#xff09;和用户界面&#xff08;UI&#xff09;设计对于任何产品的成功都至关重要。为了在这个竞争激烈的市场中脱颖而出&#xff0c;设计师和产品开发团队需要依赖强大的工具来创造引人注目且功能丰富的交互界面。下面介绍一款Axure精心制作的"…

背包问题的模板及各个等价变形

目录 0-1背包 —— 二维二重循环 01背包 —— 一维二重循环 完全背包 —— 二维三重循环 完全背包 —— 二维二重循环 完全背包 —— 一维二重循环 0-1背包 —— 二维二重循环 #include <bits/stdc.h> using namespace std; const int N 1010; int dp[N][N]; int v…

鸿蒙内核源码分析——(自旋锁篇)

本篇说清楚自旋锁 读本篇之前建议先读系列篇 进程/线程篇. 内核中哪些地方会用到自旋锁?看图: 概述 自旋锁顾名思义&#xff0c;是一把自动旋转的锁&#xff0c;这很像厕所里的锁&#xff0c;进入前标记是绿色可用的&#xff0c;进入格子间后&#xff0c;手一带&#xff0c…

Github 2024-08-19 开源项目周报Top15

根据Github Trendings的统计,本周(2024-08-19统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目7JavaScript项目3TypeScript项目3Dart项目2HTML项目1PowerShell项目1Clojure项目1C++项目1Rust项目1Bootstrap 5: Web上开发响应式、…

嵌入式软件--模电基础 DAY 2

强电和弱电&#xff0c;简单一点是以电死人为标准的&#xff0c;交流电36伏特以下&#xff0c;直流电24V以下&#xff0c;为安全电压&#xff0c;是为弱电&#xff0c;反则强电。 市电进入家庭&#xff0c;连接你的电脑&#xff0c;220V的电压为什么没有让你感到危险&#xff…

YOLO知识点总结:

分类&#xff1a; 即是将图像结构化为某一类别的信息&#xff0c;用事先确定好的类别(category)或实例ID来描述图片。这一任务是最简单、最基础的图像理解任务&#xff0c;也是深度学习模型最先取得突破和实现大规模应用的任务。其中&#xff0c;ImageNet是最权威的评测集&…

【区块链+金融服务】基于区块链的一站式绿色金融开放平台 | FISCO BCOS应用案例

科技的进步为绿色金融发展提供了新的机遇&#xff0c;但银行、企业、第三方金融机构等在进行绿色金融业务操作过程中&#xff0c; 存在着相关系统和服务平台建设成本高、迭代难度大、数据交互弱、适配难等痛点。 基于此&#xff0c;中碳绿信采用国产开源联盟链底层平台 FISCO …

【Android 远程数据库操作】

按正常情况下&#xff0c;前端不应该直接进行远程数据库操作&#xff0c;这不是一个明智的方式&#xff0c;应该是后端提供对应接口来处理&#xff0c;奈何公司各方面原因需要前端这样做。 对此&#xff0c;我对远程数据库操作做了总结&#xff0c;便于自己复盘&#xff0c;同…

【Qt】常用控件QCheckBox

常用控件QCheckBox QCheckBox表示复选按钮&#xff0c;可以允许选中多个。 QCheckBox继承自QAbstractButton 例子&#xff1a;获取复选按钮的取值 使用Qt Designer先大体进行设计 代码实现&#xff1a; #include "widget.h" #include "ui_widget.h"Widge…