「力扣」14. 最长公共前缀

iPhone免越狱Git服务器搭建教程-iSH iPhone免越狱Git服务器搭建教程 阅读详情

「力扣」14. 最长公共前缀

题目描述

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

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

示例 1:

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

示例 2:

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

提示:

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

题解

解法1(横向搜索)

可以先求两个字符串的最大公共前缀,然后在将计算结果与后面的字符串再求最大公共前缀,以此类推,如下图所示:

最大公共前缀.png
字符串数组是:[“flower”,“flow”,“flight”],先求flower和flow的最大公共前缀,结果是flow(图中红色部分),然后再用这个计算结果flow与字符串数组后面的flight计算最大公共前缀,得到结果fl(图中绿色部分)。

代码如下:

class Solution {
    public String longestCommonPrefix(String[] strs) {
        String lcp = strs[0];
        for (int i = 1; i < strs.length; i++) {
            lcp = longestCommonPrefix(lcp, strs[i]);
        }
        return lcp;
    }

    private String longestCommonPrefix(String s1, String s2) {
        char[] s1Array = s1.toCharArray();
        char[] s2Array = s2.toCharArray();
        String ans = "";
        for (int i = 0; i < Integer.min(s1Array.length, s2Array.length); i++) {
            if (s1Array[i] == s2Array[i]) {
                ans += s1Array[i];
            } else {
                break;
            }
        }
        return ans;
    }
}

提交结果如下:

image.png

执行时间只击败了10.26%的java用户,内存43.76M,只击败了5.02%的java用户,写的这么烂吗?烂在哪里了?内存使用过高?
char[] s1Array = s1.toCharArray(); char[] s2Array = s2.toCharArray(); 这里不转化为数组可能会好一点, 修改代码如下:

class Solution {
    public String longestCommonPrefix(String[] strs) {
        String lcp = strs[0];
        for (int i = 1; i < strs.length; i++) {
            lcp = longestCommonPrefix(lcp, strs[i]);
        }
        return lcp;
    }

    private String longestCommonPrefix(String s1, String s2) {
        String ans = "";
        for (int i = 0; i < Integer.min(s1.length(), s2.length()); i++) {
            char c1 = s1.charAt(i);
            char c2 = s2.charAt(i);
            if (c1 == c2) {
                ans += c1;
            } else {
                break;
            }
        }
        return ans;
    }
}

提交:

image.png

额,没啥效果。

难道是多次字符串拼接导致的运行时间长?可以只计算索引,最后截取字符串。

class Solution {
    public String longestCommonPrefix(String[] strs) {
        String lcp = strs[0];
        for (int i = 1; i < strs.length; i++) {
            lcp = longestCommonPrefix(lcp, strs[i]);
        }
        return lcp;
    }
    private String longestCommonPrefix(String s1, String s2) {
        int index = 0;
        for (int i = 0; i < Integer.min(s1.length(), s2.length()); i++) {
            char c1 = s1.charAt(i);
            char c2 = s2.charAt(i);
            if (c1 == c2) {
                index++;
            } else {
                break;
            }
        }
        return s1.substring(0, index);
    }
}

提交结果:

image.png

oh yeah! 击败了100%的用户,内存使用也更少了。

时间复杂度是O(mn),m是字符串数组中的字符串的平均长度,n是字符串的数量,空间复杂度是O(1),因为没有额外开辟空间。

解法2(纵向搜索)

还有一种解法是,数组中每个字符串按照位置一一比较,比如所有字符串0位置处是否相等,如果相等,继续比较所有后续位置,如果出现不相等,则对比结束,会得到最大公共前缀。

1.png
如图所有绿色的相等,然后所有蓝色的相等,后面不相等则结束比较。

代码如下:

class Solution {
    public String longestCommonPrefix(String[] strs) {
        String first = strs[0];
        for (int i = 0; i < first.length(); i++) {
            char c = strs[0].charAt(i); // 第一个字母,第i个位置的字符
            for (int j = 1; j < strs.length; j++) {
                if (i == strs[j].length() || c != strs[j].charAt(i)) {
                    return strs[0].substring(0, i);
                }
            }
        }
        return strs[0];
    }
}

提交:

image.png

这里要考虑字符串长度不一样的问题,i == strs[j].length()就是说如果达到了字符串的长度,那么就直接返回即可。
空间复杂度和时间复杂度跟解法1是一样的。
运行时间击败了70.07%的java用户,内存使用击败了67.59%用户,也不是很好呀,还有更好的解法吗?想了半天我也没想出来,看了下力扣的题解,看到了分治法和二分查找法。

解法3(分治法)

没想到分治算法,看了题解才知道,分治算法的思想很简单,就是将数据分片,单独计算,然后合并结果,如下图所示:

1.png

正如上图所示,将数据层层切分,当在最下层的时候开始计算左右两个字符串的最大公共前缀,以此类推,逐层向上计算,这也是递归的思想,先“递”后“归”,代码如下:

class Solution {
    public String longestCommonPrefix(String[] strs) {
        // 开始的时候传递整个数组
        return longestCommonPrefix(strs, 0, strs.length - 1);
    }

    public String longestCommonPrefix(String[] strs, int start, int end) {
        // 当start=end的时候,说明数字只有一个元素,一个元素的最大公共前缀就是它自己
        if (start == end) {
            return strs[start];
        }
        // 每次将数组拆分一半
        int mid = (end - start) / 2 + start;
        // 递归获取左边的最大公共前缀
        String lcpLeft = longestCommonPrefix(strs, start, mid);
        // 递归获取右边的最大公共前缀
        String lcpRight = longestCommonPrefix(strs, mid + 1, end);
        // 计算左右两个最大公共前后缀的最大公共前后缀
        return commonPrefix(lcpLeft, lcpRight);
    }

    public String commonPrefix(String lcpLeft, String lcpRight) {
        int minLength = Math.min(lcpLeft.length(), lcpRight.length());
        for (int i = 0; i < minLength; i++) {
            if (lcpLeft.charAt(i) != lcpRight.charAt(i)) {
                return lcpLeft.substring(0, i);
            }
        }
        return lcpLeft.substring(0, minLength);
    }
}

提交到力扣:

image.png

时间上击败了100%的java用户,空间复杂度上击败了50.28%的用户,从结果上看确实是性能提升了,时间复杂度依然是O(mn),m是字符串数组中的字符串的平均长度,n是字符串的数量,空间复杂度是O(mlogn),空间复杂度主要取决于递归调用的层数,层数最大为 logn,每层需要 m 的空间存储返回结果。

解法4(二分查找法)

二分查找法我也是没有想到,看了官方的解释才明白,具体什么意思呢?看如下说明:

要知道一点,最大公共前缀的长度一定是小于所有字符串中最小长度。
比如:

1.png

最小长度是minLength=4,那么最大公共前缀的长度一定是[0, minLength],所有可以通过[0, minLength]来实现二分查找,代码如下:

class Solution {
    public String longestCommonPrefix(String[] strs) {
        // 首先要找出最小长度值minLength
        int minLength = Integer.MAX_VALUE;
        for (String str : strs) {
            minLength = Integer.min(minLength, str.length());
        }
        // 二分查找
        int left = 0;
        int right = minLength - 1;
        while (left <= right) {
            int mid = (left + right) >> 1;
            if (isCommonPrefix(strs, mid + 1)) { // mid + 1是长度,也就是计算[0-mid]这个字符串。
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return strs[0].substring(0, left);
    }

    public boolean isCommonPrefix(String[] strs, int length) {
        String str0 = strs[0].substring(0, length);
        int count = strs.length;
        for (int i = 1; i < count; i++) {
            String str = strs[i];
            for (int j = 0; j < length; j++) {
                if (str0.charAt(j) != str.charAt(j)) {
                    return false;
                }
            }
        }
        return true;
    }
}

提交结果如下:

image.png

时间上击败了70.27%的java用户,内存消耗上则击败了30.27%的java用户。

在blender中安装vtk插件 Blender 是一个开源的、功能强大的3D计算机图形软件,广泛用于创建动画片、视觉效果、艺术作品、3D打印模型、互动3D应用程序和视频游戏。Blender 是由 Blender 基金会开发和维护的,具有丰富的功能和灵活的扩展性。在github上下载zip插件。 阅读详情

相关推荐

深入解析SerDes系统中的时钟数据恢复电路(CDR)——基于Cadence的PLL/Bang-Bang/PS-PI架构实现与仿真

本文深入解析SerDes系统中的时钟数据恢复电路(CDR),重点探讨基于Cadence平台的PLL、Bang-Bang和PS-PI三种架构的实现与仿真。通过详细的技术对比和工程实践案例,揭示CDR在高速串行通信中的关键作用,并提供TSMC 28nm工艺下的优化策略与故障排查经验,助力工程师应对10Gbps以上SerDes设计挑战。

weixin_29202687的博客 249

力扣-最长公共前缀

力扣算法刷题

zzywan 290

MacOS多次踩坑后成功安装Homebrew

来一次性成功安装Homebrew吧 官网提供的安装脚本无法成功安装Homebrew,原因大家都懂的,故采用脚本安装的方式。 下载homebrew的安装脚本brew_install 在Download路径下执行如下脚本 curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install >> brew_install 修改brew_install脚本 修改brew_install脚本。如果你的脚本打开之后是如下

weixin_41847116的博客 1981

最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 示例 1: 输入:strs = [“flower”,“flow”,“flight”] 输出:“fl” 示例 2: 输入:strs = [“dog”,“racecar”,“car”] 输出:"" 解释:输入不存在公共前缀。 代码如下: char* longestCommonPrefix(char** strs, int strsSize) { if (strsSize == 0) return NULL; if

qq_57312085的博客 303

c语言压力变送器程序设计,基于单片机的压力变送器设计

基于单片机的压力变送器设计(任务书,开题报告,外文翻译,论文15000字,代码)摘要随着工业化水平的不断提高,新型智能仪表在工业生产过程中运用也越来越广泛,同时对输出数据的准确检测和处理也变得至关重要。生产过程的运行和设备安全是极其重要的,那么如何实现对其精确的检测呢?众所周知,在工业生产过程中有一个很重要参数——压力,显然这个参数是一个必不可少的条件。故而,研究智能压力变松器系统对工业生产有着不...

weixin_33681561的博客 1962

Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)

目录1 编译 Matterport3D Simulator 源码1.1 源码下载1.2 编译 1 编译 Matterport3D Simulator 源码   在 Windows 下编译 Matterport3D Simulator 稍微有些不方便,需要对 CMakeLists.txt 进行一些修改,如果有更好的方法欢迎大家评论。 1.1 源码下载   还是直接在 Github 上搜索 Matterport3D Simulator 的 repo,下载源码。如果用 zip 方式,那么直接在下即可。如果使用

weixin_44110393的博客 4845

14. 最长公共前缀 - 力扣(LeetCode)

为数组中的第一个字符串,并从第二个字符串开始遍历数组。对于每个字符串,我们都将其与当前的。Python: 方法、列表、逻辑运算符、for else语句、if判断、字符串。在上面的代码中,我们首先处理了边界情况,包括空数组和空字符串。在遍历过程中变为空字符串,则说明不存在公共前缀,直接返回空字符串。Java:方法、数组、逻辑运算符、for循环、if判断、字符串。编写一个函数来查找字符串数组中的最长公共前缀。进行比较,并在遇到不匹配的字符时截断。如果不存在公共前缀,返回空字符串。输入不存在公共前缀。

it爱好者的学习之路 1510

【时时三省】tessy 集成测试:小白入门指导手册

有图有文字详细介绍 tessy 集成测试 操作方法。

时时三省的博客 2514

力扣算法第四题 最长公共前缀(简单里面的不简单题)

【代码】力扣算法第四题 最长公共前缀(简单里面的不简单题)

ehend的博客 671

6、探索音乐结构中的统一性:贝多芬《英雄交响曲》第一乐章的深度剖析

本文深入剖析了贝多芬《英雄交响曲》第一乐章的音乐结构,探讨其统一性的来源及表现形式。通过主题与动机、和声与调性、旋律与节奏、织体与动态等多方面的分析,揭示了这部作品在技术层面和情感表达上的卓越成就。

b9c0d的博客 518

栅极驱动电路设计(一)

SiC驱动电路设计需满足更高标准,重点包括:驱动电压需18~20V开通、-3~-5V关断;栅极电阻优选5~10Ω以平衡开关性能与可靠性;必须集成欠压保护(阈值11~15V)和快速短路保护。多电平驱动控制通过动态调节栅压和驱动强度优化性能,如前期弱驱动抑制振荡,后期强驱动降低损耗。以NCE120ED65VTP4为例,栅压从18V提升至20V可使导通损耗降低15%。相比传统方案,有源驱动(含数字分段和模拟闭环控制)能更灵活地提升开关速度与效率。

嵌入式老牛的博客 449

力扣:最长公共前缀(详解)

前言:内容包括:题目,代码实现,大致思路,代码解读

weixin_73142957的博客 552

【如何利用扩展卡尔曼滤波解决跟踪毫米波雷达目标】

笛卡尔坐标系(非极坐标系):使用两个垂直的轴(通常是x轴和y轴)来确定一个点的位置。你沿着这两个轴移动确定的距离来找到这个点。极坐标系:使用一个角度和一个距离来确定一个点的位置。首先,你转到一个特定的方向(角度),然后沿着那个方向移动确定的距离来找到这个点。希望这个例子能帮助你理解两种坐标系的基本概念!

小秋 AI SLAM 入门实战教程 884

力扣第14题“最长公共前缀”(python解决)

大神的思路是真的简洁啊,感觉自己一直是在暴力破题,根据测试用例反向弥补漏洞,很难一开始就考虑的很全面。一开始我也想到这种矩阵第一列这样去对比,但是就是没有好的实现方式。感觉要换点角度刷题了。我开始是想把strs中的每个元素转化为集合中的元素,然后取交集,但是发现对于有相同元素但顺序不同的字符串无法解决(ps同时发现交集是左右左右这样取的)。然后又是暴力破题,先取出两个字符串,找到公共前缀,用这个公共前缀去和剩余字符串比较。

m0_60689417的博客 432

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

2024.6.2 力扣14题“最长公共前缀”

本题的解法:先找出可能的公共最大前缀长度,接着将字符串数组中的每个字符串一位一位进行比较,比较的最大范围就是之前找出的可能的公共最大前缀长度,在比较的过程中,一旦发现各个字符串在某一位上对应的值不同,立即停止,返回已经找到的最长公共前缀,发现各个字符串在某一位上对应的值都相同,那么最长公共前缀的值添加一位。

m0_53543026的博客 568

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

力扣第14题:最长公共前缀

力扣第14题:最长公共前缀

一位想要成为优秀全栈工程师的有志青年! 652

LeetCode14.最长公共前缀(Kotlin语言)

LeetCode14.最长公共前缀(Kotlin语言) 题目描述 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 示例 1: 输入: ["flower","flow","flight"] 输出: "fl" 示例 2: 输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。 说明: 所有输入只包含小...

AI天才研究院 8639

LeetCode-[14] 最长公共前缀

/* @lc app=leetcode.cn id=14 lang=java [14] 最长公共前缀 https://leetcode-cn.com/problems/longest-common-prefix/description/ algorithms Easy (32.64%) Total Accepted: 67.2K Total Submissions: 205.8K T...

fffzlfk的博客 194

力扣14.最长公共前缀

【代码】力扣14.最长公共前缀。

Pisasama的博客 361

leetcode 14. 最长公共前缀(C++)

leetcode 14. 最长公共前缀(C++) :查找字符串数组中的最长公共前缀

nanashi_F的博客 371

LeetCode第14题:最长公共前缀

LeetCode第14题:最长公共前缀 题目: 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 示例 1: 输入: ["flower","flow","flight"] 输出: "fl" 示例 2: 输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存

不写代码的博客 295

Java算法-LeetCode14最长公共前缀

题目地址:https://leetcode-cn.com/problems/longest-common-prefix/ 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串""。 示例1: 输入: ["flower","flow","flight"] 输出: "fl" 示例2: 输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。 说明: 所有输入只包含小写字母a-z。 来源:力扣(LeetCode) 链接...

b379685397的博客 2万+

leetcode 14_最长公共前缀

leetcode 14_最长公共前缀 该解法执行时间 40ms 思路: 过滤掉无值和只有一个值的情况 取出列表中最短的字符串(如果有最长公共前缀,最多也就是其中最短的一个值) 遍历列表,判断每一个字符串在从开头截取出来的同等长度下是否一样,一样的话,计数加1;不一样直接跳过 判断本次循环结束最终的计数是否与列表长度一致,一致,说明这就是最长公共前缀 不一致,将当前最短值截取掉最后一位,加上死循环...

qyf__123的博客 215

【leetcode】14. 最长公共前缀

package vip.wulang.leetcode.problem14; public class Solution { public String longestCommonPrefix(String[] strs) { if (strs == null || strs.length == 0) { return ""; } String str = strs[0]; int min = str.le.

【Mr-Coolerwu】 199

力扣最长公共前缀

力扣14.题目描述:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""。 示例1 输入: ["flower","flow","flight"] 输出: "fl" 示例2 输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。 说明:所有...

sarracode的博客 326

LeetCode14.最长公共前缀

原题链接:https://leetcode-cn.com/problems/longest-common-prefix/ 14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 示例 1: 输入: [“flower”,“flow”,“flight”] 输出: “fl” 示例 2: 输入: [“dog”,“racecar”,“car”] 输出:...

qq_45254908的博客 196

leetcode-14最长公共前缀

leetcode-14最长公共前缀 题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串""。 示例1: 输入: ["flower","flow","flight"] 输出: "fl" 示例2: 输入: ["dog","racecar...

129
上一篇: 「力扣」13. 罗马数字转整数
下一篇: 「力扣」20. 有效的括号
「已注销」
博客等级 码龄3年 128粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值