算法通关村第十二关黄金挑战——最长公共前缀问题解析

news2024/11/19 0:37:35

大家好,我是怒码少年小码。

最长公共前缀

LeetCode 14:编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。

示例:

  • 输入:strs = [“flower”,“flow”,“flight”]
  • 输出:“fl”

方法一:

分析:最先想到的应该就是选择一个字符串作为基点,和之后的字符串逐个比较了,就像竖向比较一样:

代码如下:


这段代码实现了一个函数 longestCommonPrefix,用于找出一组字符串中最长的公共前缀。下面对代码进行详细解释:

string longestCommonPrefix(vector<string>& strs) {
   if(!strs.size()){
       return "";
   }
   int length = strs[0].size();
   int count = strs.size();
   for(int i=0 ; i< length;i++){
       char c = strs[0][i];
       for(int j = 1;j<count;j++){
           if(i==strs[j].size() || strs[j][i] != c){
               return strs[0].substr(0,i);
           }
       }
   }
   return strs[0];
}
  1. if(!strs.size()):首先,代码检查传入的字符串向量 strs 是否为空。如果为空,则直接返回一个空字符串,因为没有任何字符串需要进行比较与查找公共前缀。
  2. int length = strs[0].size();:接下来,代码获取第一个字符串的长度作为 length 变量的值,以确定最长公共前缀的最大可能长度。
  3. int count = strs.size();:获取传入的字符串向量 strs 的大小,表示包含的字符串数量。
  4. for(int i=0 ; i< length;i++):这是一个外层循环,用于遍历第一个字符串的字符。
  5. char c = strs[0][i];:获取第一个字符串的第 i 个字符,并将其存储在变量 c 中,作为待比较的字符。
  6. for(int j = 1;j<count;j++):这是一个内层循环,用于遍历除第一个字符串之外的其他所有字符串。
  7. if(i==strs[j].size() || strs[j][i] != c):在每次循环内部,首先判断索引 i 是否已经超出某个字符串的长度,或者当前字符串的第 i 个字符与第一个字符串的第 i 个字符是否相等。
    • 如果索引 i 已经超出了某个字符串的长度,或者当前字符串的第 i 个字符与第一个字符串的第 i 个字符不相等,表示已经找到了最长公共前缀的结束位置,即当前索引 i 的位置。此时,函数使用 substr(0,i) 返回第一个字符串的前 i 个字符作为最长公共前缀。
    • 否则,继续比较下一个字符串的第 i 个字符。
  8. 如果没有在内层循环中返回最长公共前缀,说明第一个字符串是所有字符串的公共前缀,因此返回第一个字符串即可。

substr(0, i) 是一个字符串的成员函数,用于提取从索引 0 开始,长度为 i 的子字符串。在这段代码中,如果找到了最长公共前缀的结束位置(索引 i),函数使用 substr(0,i) 来提取第一个字符串的前 i 个字符作为最长公共前缀。

方法二:

分析:先找到数组中前两个字符串的最长公共前缀,然后再比较第二个字符串和第三个字符串的最长公共前缀,看看是否需要缩小,直到数组遍历完毕或者最长公共前缀已经为零了。

代码我使用Java写的:

 public String longestCommonPrefix(String[] strs) {
        if(strs == null || strs.length == 0){
            return "";
        }
        String prefix = strs[0];
        int count = strs.length;
        for(int i =1;i<count;i++){
            prefix = longestCommonPrefix(prefix,strs[i]);
            if(prefix.length() == 0){
                break;
            }
        }
        return prefix;
    }
     public String longestCommonPrefix(String str1,String str2){
         int length = Math.min(str1.length(),str2.length());
         int i =0;
         while(i<length && str1.charAt(i) == str2.charAt(i)){
             i++;
         }
         return str1.substring(0,i);
     }

首先,代码判断了输入参数是否为空或数组长度是否为0,如果是,则返回空字符串。接下来,定义了一个变量prefix,并将其初始化为数组的第一个字符串,作为初始化前缀。同时,定义了一个计数变量count,将其赋值为数组的长度。

然后,通过一个循环遍历数组中的每个字符串(从第二个字符串开始),将当前前缀和当前字符串传递给另一个方法longestCommonPrefix,获取新的前缀。在这个方法中,代码首先计算了两个字符串的最小长度,因为最长公共前缀不能超过这个最小长度。

然后,通过一个while循环,从字符串的第一个字符开始逐个比较两个字符串的字符是否相等,直到遇到不相等的字符或达到最小长度为止。循环结束后,返回前缀字符串,它就是两个字符串的最长公共前缀。

longestCommonPrefix(String[] strs)方法中,每次获取了新的前缀后,代码会判断新的前缀的长度是否为0,如果是,则终止循环。最后,返回最终的前缀作为结果。

它的时间复杂度是O(n*m),其中n是字符串的平均长度,m是数组中字符串的数量。

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

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

相关文章

CSS+Javascript+Html日历控件

最近&#xff0c;因需要用HTMLJAVASCRIPTCSS实现了一个日历控件&#xff0c;效果如下&#xff1a; 单击上月、下月进行日历切换。当前日期在日历中变颜色标注显示。还是老老套路、老方法&#xff0c;分HMLCSSJAVASCRIPT三部分代码。 一、html代码 <h1>学习计划</h1…

HubSpot CRM是什么?如何添加、使用呢?

HubSpot CRM是一款强大的客户关系管理工具&#xff0c;它不仅简化了销售和市场营销过程&#xff0c;还提供了多种功能&#xff0c;有助于增强客户互动、提高销售效率和提供更多的洞察信息。 今天运营坛将带领大家深入了解HubSpot CRM&#xff0c;涵盖了它的定义、使用流程、添…

国产芯片vs“国际水平”,有距离也有超越!

当前&#xff0c;国产芯片正在迎来全新的发展阶段。国产终端芯片性能怎么样&#xff0c;与国际主流产品相比&#xff0c;表现如何&#xff1f;今天笔者就针对目前热度较高的四款国产CPU进行参数分析与性能跑分横向对比。 此次国产芯片评测型号分别是海光C86-3250、龙芯3A5000H…

java蓝桥11-20题总结

文章目录 11.排序1.代码2.知识点冒泡排序 12.跑步锻炼1.代码 13.蛇形填数1.代码 14.递增序列1.代码 15.AB&#xff08;OJ示例题目&#xff09;16.杨辉三角形1.代码2.知识点 17.货物1.代码 18.九进制转十进制1.代码 19.等差素数列1.代码 20.七段码 11.排序 1.代码 package lanq…

网络套接字编程(一)

网络套接字编程(一) 文章目录 网络套接字编程(一)预备知识源IP地址和目的IP地址端口号TCP/UDP协议特点网络字节序 socket编程socket常用APIsockaddr结构 简易UDP网络程序服务端创建套接字服务端绑定IP地址和端口号字符型IP地址VS整型IP地址服务端运行客户端创建套接字客户端绑定…

python使用ffmpeg来制作音频格式转换工具(优化版)

简介:一个使用python加上ffmpeg模块来进行音频格式转换的工具。 日志: 20231030:第一版,设置了简单的UI布局和配色,实现音频转为Mp3、AAC、wav、flac四种格式。可解析音频并显示信息,可设置转换后的保存路径 UI界面: 编程平台:visual studio code 编程语言:python 3…

如何把编辑器编辑好的文章分享给别人?

哈喽&#xff0c;大家好&#xff0c;今天小编给大家分享一个非常实用的功能&#xff0c;当我们在使用微信编辑器编辑排版文章的时候&#xff0c;需要在不发表的前提下分享给好友或者需要先给领导看一下的时候该怎么办呢&#xff1f;有三个方法&#xff0c;都可以在不发表的前提…

Ortec974A EPICS IOC程序

1&#xff09; 创建一个用户存放这个IOC程序结构的目录&#xff1a; rootorangepi4-lts:/usr/local/EPICS/program# mkdir ortec974A rootorangepi4-lts:/usr/local/EPICS/program# cd ortec974A/ rootorangepi4-lts:/usr/local/EPICS/program/ortec974A# ls2&#xff09;使用…

系列四十二、Spring的事务传播行为案例演示(二)#REQUIRED

一、演示Spring的默认传播行为&#xff08;REQUIRED&#xff09; 1.1、运行之前表中的数据 1.2、StockServiceImpl /*** Author : 一叶浮萍归大海* Date: 2023/10/30 15:43* Description:*/ Service(value "stockServiceREQUIRED") public class StockServiceImpl…

Mysql设置了更新时间自动更新,指定更新部分sql时不进行时间更新

现象&#xff1a; 因为字段设置了自动更新&#xff0c;所以sql语句一进行修改此字段就会自动更新时间&#xff0c;但是呢我们的有部分定时任务是半夜执行&#xff0c;并且不能让这个任务修改到数据的更新时间 解决&#xff1a; <update id"updateCreative">ALT…

element-plus DateTimePicker日期选择器,限制指定日期和时间不可选择

element-plus日期选择器&#xff0c;在指定日期时间前不可选择。 限制日期选择&#xff0c;使用disabled-date 限制小时选择&#xff0c;使用disabled-hours 限制分钟选择&#xff0c;使用disabled-minutes 限制毫秒选择&#xff0c;使用disabled-seconds 指定日期当天的时间有…

一带一路10周年:爱创科技加速中国药企国际化征程

“源自中国&#xff0c;属于世界”。 共建“一带一路”倡议提出10周年来&#xff0c;中国与沿线国家经济深度融合&#xff0c;在共商共建共享的基本原则下&#xff0c;“一带一路”形成了国际合作的平台和机制&#xff0c;跨国经济合作已基本形成。 随着“一带一路”合作日益加…

【脚本笔记】AssetDatabase

AssetDatabase是编辑器下的处理资源操作的重要类&#xff0c;主要用于访问资源并针对资源执行操作的接口。 这里面所有的操作路径都是基于Unity项目的相对路径也就是Assets/xxx或者Assets/xxx.jpg这种。CacheServer 主要解决的是缩短大型团队导入资源的时间。当配置后&#xff…

K8S部署应用时从harbor拉取镜像失败

问题描述 K8S部署服务拉取镜像失败&#xff1a;ImagePullBackOff K8S拉取镜像提示&#xff1a;Failed to pull image “IP:PORT/zcy-project/nginx:1.16.1”: rpc error: code Unknown desc Error response from daemon: unauthorized: unauthorized to access repository: …

mediapipe 训练自有图像数据分类

参考&#xff1a; https://developers.google.com/mediapipe/solutions/customization/image_classifier https://colab.research.google.com/github/googlesamples/mediapipe/blob/main/examples/customization/image_classifier.ipynb#scrollToplvO-YmcQn5g 安装&#xff1a…

配音软件怎么选?推荐三款自用好评的

会刷短视频的小伙伴肯定知道&#xff0c;很多创作者想让自己的视频更加丰富&#xff0c;呈现更加完美的视频效果&#xff0c;往往会在视频里的空境部分加入一些旁白解说&#xff0c;你们难道就不好奇吗&#xff1f;这些声音为什么这么想真人说的话&#xff0c;而且还可以这么自…

虚幻C++基础 day1

虚幻C概念 虚幻C类的继承结构 虚幻引擎C类层级结构(Hierarchy) 这些基本类又派生出了很多子类&#xff0c;例&#xff1a; UE中的反射与垃圾回收系统 例如一个创建了一个Actor类&#xff0c;有一个Actor类型指针去指向这个Actor类&#xff0c;如果的指针被销毁了&#xff…

编译环境里存在yaml-cpp的多个版本时可能引起的问题

有时要编译的程序自带了特定版本的yaml-cpp&#xff0c;同时系统目录下也安装了更高版本的yaml-cpp&#xff0c;这时可能引起编译错误&#xff0c;就是某些yaml-cpp的API不认识&#xff0c;例如&#xff1a; 出现这种问题倒好办&#xff0c;正常情况下不可能&#xff0c;肯定能…

目标检测算法发展史

前言 比起图像识别&#xff0c;现在图片生成技术要更加具有吸引力&#xff0c;但是要步入AIGC技术领域&#xff0c;首先不推荐一上来就接触那些已经成熟闭源的包装好了再提供给你的接口网站&#xff0c;会使用别人的模型生成一些图片就能叫自己会AIGC了吗&#xff1f;那样真正…

电脑突然提示找不到msvcp140.dll怎么办,解决msvcp140.dll丢失的办法

当我们在电脑上运行某些软件或游戏时&#xff0c;可能会遇到一个常见的错误消息&#xff1a;“找不到msvcp140.dll”。出现这样的情况通常意味着系统缺少一个重要的动态链接库文件&#xff0c;而这可能会导致程序无法正常启动。如果你现在遇到了这个问题&#xff0c;哪有可以用…