首页 > 其他分享 >14.最长公共前缀

14.最长公共前缀

时间:2024-09-04 10:26:28浏览次数:9  
标签:return 14 strs 前缀 int 字符串 最长 size

14.最长公共前缀

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

示例 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”

示例 2:
输入:strs = [“dog”,“racecar”,“car”]
输出:“”
解释:输入不存在公共前缀。

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

解题思路
代码一
对于所有的字符串去求前缀的交集,那么得到的就是最长公共前缀。其中,切割字符串的子串的函数是substr。这种思路其实是按行去进行比较,从而求得最长公共前缀。

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if(!strs.size()) return "";
        string prefix = strs[0];//最长公共前缀
        int count = strs.size();
        for(int i=1;i<count;i++){
            prefix=longestCommonPrefix(prefix,strs[i]);
            if(!prefix.size()){
                break;
            }
        }
        return prefix;
    }
    string longestCommonPrefix(const string& str1,const string& str2){
        int len=min(str1.length(),str2.length());
        int index=0;
        while(index<len && str1[index]==str2[index]){
            index++;
        }
        return str1.substr(0,index);
    }
};

代码二
既然代码一是按照行去比较,那么我们求得的最长公共前缀按照列的方式来看,不就是枚举第一个字符串的每项,再去和每一个字符串的每项去判断嘛,因此得到了按照列访问的方式,代码如下所示

class Solution {
public:
    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];
    }
};

代码三
在一个字符串的数组中,那么一定会在字符串之间有着从小到大的排序,那么,我们求得的最长公共前缀不就是直接求最短的字符串和最长的字符串的前缀就可以,这俩的公共前缀一定符合其他所有长度在他们之间的字符串

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {    
        int n = strs.size();    
        sort(strs.begin(), strs.end());    
        int cnt=0;    
        for(int i = 0; i < strs[0].size() && i < strs[n - 1].size(); ++i){       if(strs[0][i] == strs[n - 1][i]){    
                cnt++;    
            }
            else{    
                break;    
            }
        }
        return strs[0].substr(0,cnt);    
    }
};

代码四、代码五可以用分治和二分的方法去做,不过相比于上面的三种解法,就显得麻烦,时间多的、想练习基本算法的思路的可以试着写写,后续写了在附上代码了!

标签:return,14,strs,前缀,int,字符串,最长,size
From: https://blog.csdn.net/weixin_46006714/article/details/141872909

相关文章

  • A-计算机毕业设计定制:76114客户关系管理系统(免费领源码)可做计算机毕业设计JAVA、PHP
    摘 要 随着信息化时代的发展,各行各业都逐渐意识到客户关系管理的重要性。传统的客户管理方式已经无法满足日益增长的客户群体及复杂的业务需求。因此,客户关系管理系统应运而生,以提高服务质量、降低成本、促进营销活动,并实现客户与企业之间更紧密的互动。本文主要探讨如何......
  • CSP2024-14
    A题意:给定一张边权为正的无向图,\(k\)条关建边,求从\(1\)经过所有关建边回到\(1\)的最短路。\(k\le12\)。所有关键边的端点加上\(1\)也就\(25\)个,\(f(x,S)\)表示当前在\(x\),已经经过的关键边集合为\(S\)的最短路,随便转移。傻逼人干傻逼事,最短路不开longlong调......
  • CMake构建学习笔记14-依赖库管理工具
    如果说做C/C++开发最大的痛点是什么,那么一定是缺少一个官方的统一的包管理器。认真的说,如果你要用C/C++干点什么,至少需要(Windows系统下):C/C++语言本身、标准库、以及操作系统API几乎干不了什么,除非你真的想从零开始造轮子。开始找一些现成的实现组成依赖库。最好看能不能找到预......
  • 每日OJ_牛客_最长公共子序列(dp模板)
    目录牛客_最长公共子序列(dp模板)解析代码牛客_最长公共子序列(dp模板)最长公共子序列__牛客网解析代码子序列即两个字符串中公共的字符,但不一定连续。        从题干中可以提取出问题:求字符串s和t的最长公共子序列假设LCS(m,n)为长度为m的字符串s与长度为n的......
  • 【读书笔记-《30天自制操作系统》-14】Day15
    本篇内容开始讲解多任务。本篇内容结构很简单,先讲解任务切换的原理,再讲解任务切换的代码实践。但是涉及到的知识不少,理解上也有些难度。1.任务切换与多任务原理1.1多任务与任务切换所谓多任务,指的是操作系统同时运行多个任务。但是这种说法实际上是不准确的。如果只有......
  • 20240903_190143 从清华到MIT知识点
    分词库的安装下载只需要一次即可pipinstalljieba分词的使用精准模式默认二级使用精准模式importjiebali=jieba.lcut(句子)全模式importjiebali=jieba.lcut(句子,cut_all=True)词频统计li=["a","b","a"]d={}forwinli: #查看这个w在字典中有几......
  • 电力系统机组组合优化调度(IEEE14节点、IEEE30节点、IEEE118节点)(Matlab代码实现)
     ......
  • 车载测试协议:ISO-14229、ISO-15765、ISO-11898、ISO-26262【车企实操项目学习】
      FOTA模块中OTA的知识点:1.测试过程中发现哪几类问题?   可能就是一个单键的ecu,比如升了一个门的ecu,他的升了之后就关不上,还有就是升级组合ecu的时候,c屏上不显示进度条。2.在做ota测试的过程中,会做网络通信的测试吗?   网络通信测试的话,有做,但是目前我的......
  • 最近(2024.08.14-2024.08.25 )面试感悟
    简历最近(2024.08.14-2024.08.25)除了周末,都在面试的路上,平均每天3、4场面试,边面试边回顾知识点边完善简历,在哀鸿遍野的招聘市场里,简历做了调整,突出自己的优势,比如读过spring源码要能清楚的说出来、比如对jvm内存模型的了解,及为什么采用对应的垃圾回收算法;比如遇到的jvm内存及解决......
  • Day14|第六章 二叉树 part02| 226.翻转二叉树| 101. 对称二叉树| 104.二叉树的最大深
    226.翻转二叉树(递归只能前序或者后序,中序不行)classSolution{publicTreeNodeinvertTree(TreeNoderoot){if(root==null)returnnull;swap(root);invertTree(root.left);invertTree(root.right);//swap(root);......