力扣最热一百题——最长公共前缀

目录

题目链接:14. 最长公共前缀 - 力扣(LeetCode)

题目描述

示例

提示:

解法一:逐步缩减前缀

Java写法:

运行时间

C++写法:

运行时间

时间复杂度和空间复杂度

解法二:字典序排序

什么是字典序?

为什么通过字典序排序之后的首位字符串就可以找到最长公共前缀?

举例说明:

Java写法:

运行时间

C++写法:

运行时间

时间复杂度和空间复杂度

总结


题目链接:14. 最长公共前缀 - 力扣(LeetCode)

注:下述题目描述和示例均来自力扣

题目描述

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

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

示例

示例 1:

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

示例 2:

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

提示:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 仅由小写英文字母组成


解法一:逐步缩减前缀

这段代码的实现思路是基于一个假设开始的:它假设数组中的第一个字符串(strs[0])是最长的公共前缀。然后,它遍历数组中的每个后续字符串(从strs[1]开始),并检查当前假设的公共前缀(prefix)是否仍然是这些字符串的前缀。

具体实现步骤如下:

  1. 处理空数组:首先,它检查传入的字符串数组strs是否为空或长度为0。如果是,那么没有公共前缀,直接返回空字符串。

  2. 初始化公共前缀:然后,它将数组中的第一个字符串(strs[0])作为初始的公共前缀(prefix)。

  3. 遍历数组:接下来,它使用一个for循环遍历数组中的每个后续字符串(从索引1开始,即strs[1]strs[strs.length - 1])。

  4. 检查前缀:对于每个后续字符串,它使用indexOf方法检查当前假设的公共前缀(prefix)是否是该字符串的前缀(即indexOf(prefix)是否返回0)。

    • 如果不是前缀(indexOf(prefix)不等于0),则进入一个while循环,逐步缩短prefix(通过移除prefix的最后一个字符),直到prefix成为该字符串的前缀或prefix变为空字符串。
    • 如果在缩短prefix的过程中prefix变为空字符串,那么说明没有公共前缀,函数返回空字符串。
  5. 返回结果:如果遍历完所有字符串后都没有返回空字符串,那么说明prefix就是所有字符串的最长公共前缀,函数返回prefix

       当然了既然把这个方法放在第一位那么就是可以优化,这个实现虽然可以正确找到最长公共前缀,但它在有一些情况下可能不是最高效的。特别是,当prefix被缩短时,它可能会多次检查同一个较短的prefix是否是某个字符串的前缀,这是肯定是多余的了。但是由于力扣的测试用例说实话还是挺友善的,所以实现起来的速度还是挺快的。

Java写法:

class Solution {public String longestCommonPrefix(String[] strs) {// 处理空数组if (strs == null || strs.length == 0) {return "";  }// 假设第一个字符串是最长公共前缀String prefix = strs[0]; for (int i = 1; i < strs.length; i++) {// 如果当前字符串不以 prefix 开头while (strs[i].indexOf(prefix) != 0) {  // 缩短前缀prefix = prefix.substring(0, prefix.length() - 1);  // 如果前缀为空,返回空字符串if (prefix.isEmpty()) {return "";  }}}// 返回找到的最长公共前缀return prefix;  }
}

运行时间

C++写法:

class Solution {
public:string longestCommonPrefix(vector<string>& strs) {// 处理空数组if (strs.empty()) {return "";  }// 假设第一个字符串是最长公共前缀string prefix = strs[0];// 从第二个字符串开始遍历for (int i = 1; i < strs.size(); i++) {// 如果当前字符串不以 prefix 开头while (strs[i].find(prefix) != 0) {  // 缩短前缀prefix = prefix.substr(0, prefix.size() - 1);// 如果前缀为空,返回空字符串if (prefix.empty()) {return "";  }}}// 返回找到的最长公共前缀return prefix;}
};

运行时间

 

时间复杂度和空间复杂度

 




解法二:字典序排序

什么是字典序?

        字典序(Lexicographical Order)是一种字符串排序方式,这个方式类似于我们在字典中查找单词时候的顺序。字符串根据其字符的排列方式,按照字母表的顺序进行排序。

        例如,对于字符串 ["apple", "banana", "grape", "orange"],按照字典序排序的结果是:

  • apple
  • banana
  • grape
  • orange

        在字典序中,首先比较字符串的首字母,如果首字母相同,就比较第二个字母,依此类推。对于长度不同的字符串,如果前面几位都相同的话,那么就让较短的字符串排在前面。例如:

  • "abc" 排在 "abcd" 前面。

为什么通过字典序排序之后的首位字符串就可以找到最长公共前缀?

        通过字典序排序后,数组的第一个字符串和最后一个字符串之间的公共前缀,实际上也是所有字符串之间的最长公共前缀。这是因为:

  1. 字典序是按照字符的逐个比较进行的,因此字典序排序后的第一个字符串和最后一个字符串在整个数组中具有最小和最大的“字母顺序”。

  2. 最小和最大的字符串之间的差异最大,换句话说,它们在前面相同的部分已经是所有字符串中公共前缀的最长部分。它们的不同部分意味着,其他字符串不可能有更长的公共前缀。

  3. 公共前缀只会出现在最小和最大字符串的前缀部分,因为如果最小字符串和最大字符串的前缀部分相同,其他字符串在这部分也一定相同。

举例说明:

假设字符串数组是:["flower", "flow", "flight"],那么排序后结果就是:

  • "flight"
  • "flow"
  • "flower"

        比较排序后的第一个字符串 "flight" 和最后一个字符串 "flower",它们的最长公共前缀是 "fl"。因此,我们只需要比较第一个和最后一个字符串,酱紫找到它们的公共前缀就可以确定整个数组的最长公共前缀,因为其他字符串在这部分的前缀也必然是相同的。

Java写法:

import java.util.Arrays;class Solution {public String longestCommonPrefix(String[] strs) {// 获取数组长度int len = strs.length;// 如果数组为空,返回空字符串if (len == 0) {return "";}// 对字符串数组进行字典序排序Arrays.sort(strs);// 定义结果字符串,使用StringBuilder便于拼接字符串StringBuilder res = new StringBuilder();// 比较排序后第一个和最后一个字符串的相似部分for (int i = 0; i < strs[0].length() && i < strs[len - 1].length(); i++) {// 如果当前字符相同,加入结果if (strs[0].charAt(i) == strs[len - 1].charAt(i)) {res.append(strs[0].charAt(i));} else {// 如果不相同,结束循环break;}}// 返回结果return res.toString();}
}

运行时间

C++写法:

class Solution {
public:string longestCommonPrefix(vector<string>& strs) {// 数组长度int len = strs.size();// 对这个字符串数组进行字典序排序sort(strs.begin(), strs.end());// 定义出resstring res = "";// 找这俩的相似点for(int i = 0; i < strs[0].size() && i < strs[len - 1].size(); i++){// 一样就加进去if(strs[0][i] == strs[len - 1][i]){// 拼接答案res += strs[0][i];}else{// 不一样就说明到头了直接返回break;}}return res;}
};

运行时间

时间复杂度和空间复杂度

 


总结

        哇塞是不是又懂了一个操作的方法,这个字典序的思路简直是天才好吧

那么大家加油!!!

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

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

相关文章

国人卖家可折叠无线充电器发起TRO专利维权,功能相同可能侵权

案件基本情况&#xff1a;起诉时间&#xff1a;2024-8-5案件号&#xff1a;2024-cv-22971原告&#xff1a;SHANGXING TECHNOLOG (SHENZHEN) CO., LTD原告律所&#xff1a;Rubio & Associates, P.A.起诉地&#xff1a;佛罗里达州南部法院涉案商标/版权&#xff1a;原告品牌简…

Tomcat后台弱口令部署war包

1.环境搭建 cd /vulhub/tomcat/tomcat8 docker-compose up -d 一键启动容器 2.访问靶场 点击Manager App tomcat8的默认用户名和密码都是tomcat进行登录 3.制作war包 先写一个js的一句话木马 然后压缩成zip压缩包 最后修改后缀名为war 4.在网站后台上传war文件 上传war文件…

本地提权【笔记总结】

文章目录 服务命令at命令提权介绍适用版本复现 sc命令提权介绍适用版本复现 ps应用程序提权复现 进程注入进程迁移注入介绍条件复现 MSF自动化注入介绍getsystem原理 复现 MSF令牌窃取介绍复现 烂土豆提权介绍适用版本复现 UAC绕过介绍复现使用ask模块绕过使用bypassuac_sluihi…

NLP 主流应用方向

主流应用 文本分类文本匹配序列标注生成式任务 应用细分 文本纠错话者分离 本质为文本分类任务数字归一化 实现数字映射&#xff0c;提高内容可读性 如将一九九九转1999

乱弹篇(53)丹桂未飘香

今天是2024年“秋分”节气&#xff0c;也是第7个中国“农民丰收节”&#xff0c;本“人民体验官”推广人民日报官方微博文化产品《文化中国行看丰收之美》。 截图&#xff1a;来源“人民体验官”推广平台 人民微博说&#xff1a;“春华秋实&#xff0c;岁物丰成。”又说&#…

双指针经典题目

目录 1089. 复写零 法一&#xff1a;用栈实现 法二&#xff1a;用双指针 202. 快乐数 11. 盛最多水的容器 611. 有效三角形的个数 LCR 179. 查找总价格为目标值的两个商品 15. 三数之和 18. 四数之和 1089. 复写零 题目链接&#xff1a;1089. 复写零 - 力扣&#xff…

【模板进阶】类模板中可变参的特殊继承方式

本篇博客主要介绍在类模板中可变参数的特殊继承方式和展开方式。 回顾之前的可变参展开&#xff1a;可变参模板 一、父类 首先&#xff0c;我们有一个父类&#xff0c;是一个可变参类模板&#xff0c;如下&#xff1a; //父类 template<typename...Args> class myclass…

windows cuda12.1 pytorch gpu环境配置

安装cuda12.1 nvcc -V conda创建pythong3.10环境 conda create -n llama3_env python3.10 conda activate llama3_env 安装pytorch conda install pytorch torchvision torchaudio pytorch-cuda11.8 -c pytorch -c nvidia gpu - Pytorch version for cuda 12.2 - Stack Ov…

MySQL面试不翻车指南:轻松掌握数据库秘籍

写在前面 &#x1f525;我把后端Java面试题做了一个汇总&#xff0c;有兴趣大家可以看看&#xff01;这里&#x1f449; ⭐️在无数次的复习巩固中&#xff0c;我逐渐意识到一个问题&#xff1a;面对同样的面试题目&#xff0c;不同的资料来源往往给出了五花八门的解释&#…

大屏幕导入名单电话等数据滚动抽奖制作教程_姓名电话号码数字滚动抽奖产品

原文地址 在当今数字化时代&#xff0c;抽奖活动也紧跟潮流&#xff0c;不断进行创新。导入数据滚动抽奖产品就是其中一种令人耳目一新的抽奖方式&#xff0c;它不仅提高了抽奖的公平性和透明度&#xff0c;还给参与者带来了全新的体验。导入数据滚动抽奖产品的优势&#xff1a…

[Linux]常用操作指令

实用指令 1.指定运行级别 查看当前运行级别 切换运行级别 设置默认运行级别 2.找回root密码 3.帮助指令 查看ls命令的帮助信息 列出文件, 包含隐藏文件 单行展示信息 命令可以组合使用 获得cdn内置命令的帮助信息 4.文件目录指令 5.组管理和权限管理 所有者 所在组

鸿蒙 WebView 如何 Debug

前置&#xff1a; hdc chrome //----------------------------------------------------------------------------------------------- hdc shell cat /proc/net/unix | grep devtools 0: 00000002 0 10000 1 1 81134005 webview_devtools_remote_62479exit执行&…

【java面经速记】Mysql和ES数据同步

目录 Mysql业务数据库 ES查询数据库 数据同步方案 同步双写 异步双写&#xff08;MQ方式&#xff09; 基于Mysql的定时扫描同步 基于Binlog实时同步 使用canal监听binlog同步数据到es&#xff08;流行方案&#xff09; 拓展:mysql的主从复制原理 canal原理&#xff1a…

通信工程学习:什么是NFVI网络功能虚拟化基础设施层

NFVI&#xff1a;网络功能虚拟化基础设施层 NFVI&#xff08;Network Functions Virtualization Infrastructure&#xff09;即网络功能虚拟化基础设施层&#xff0c;是NFV&#xff08;Network Functions Virtualization&#xff0c;网络功能虚拟化&#xff09;架构中的一个重要…

PS相关操作记录

1. 磨皮步骤 1.1. 图层操作 先对照片进行去瑕疵、液化等操作&#xff0c;操作完的图层&#xff0c;重命名为液化&#xff0c;方便识别。复制两个图层&#xff0c;分别改为“低频”、“高频”&#xff0c;低频在下&#xff0c;高频在上。选中“低频”图层&#xff0c;滤镜 -&g…

midjourney 网页版收费页面

网页版体验了一个月&#xff0c;感觉确实方便很多 midjourney 网页版地址https://www.midjourney.com/archive 主要是左下角进行相关设置 付费以后&#xff0c;记得在edit里面取消续费&#xff0c;取消后如图所示&#xff0c;我这个月用完&#xff0c;这个时间是即时的&…

嵌入式C语言自我修养:GNU C编译器扩展语法精讲

在Linux内核的源码中&#xff0c;你会发现许多这样的“奇特”代码。它们看起来可能有点陌生&#xff0c;但它们实际上是C语言的一种扩展形式&#xff0c;这种扩展在C语言的标准教材中往往不会提及。这就是为什么你在阅读Linux驱动代码或内核源码时&#xff0c;可能会感到既熟悉…

java sdk下载,解决下载了java但是编译不了

直接搜Java得到的网站使用不了的 应该只是个功能包或者版本太低用不了 得去oracle公司搜java这个产品去下载

MySQL中去除重复

除去相同的行 SELECT DISTINCT 列名 FROM 表名; 示例&#xff1a;查询employees表&#xff0c;显示唯一的部门ID select distinct department_id from employees;

心理教育辅导系统:Spring Boot技术实现

4 系统设计 4.1系统概要设计 高校心理教育辅导系统主要分为管理员、教师和学生三个角色&#xff0c;系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet&#xff0c;便可以在任…