LeetCode力扣每日一题(Java):14、最长公共前缀

一、题目

二、解题思路

1、我的思路

乍一看我的代码量还是比较少,但是提交上去发现时间效率和空间效率都不占优势

讲讲我的思路:首先通过for循环找出数组中长度最短的字符串,并用min储存最短字符串的长度,最长公共前缀不可能比min更大。其次在通过双重循环逐个比较数组中字符串的每一位是否对应相等,若相等就往s中追加一个字母,若不相等则直接结束程序,返回s

String s = "";
        int min = strs[0].length();
        for (int i = 1; i < strs.length; i++){
            if(strs[i].length() < min){
                min = strs[i].length();
            }
        }
        for (int j = 0; j < min; j++) {
            for (int i = 1; i < strs.length; i++) {
                if (strs[0].charAt(j) != strs[i].charAt(j)) {
                    return s;
                }
            }
            s += strs[0].charAt(j);
        }
        return s;

2、官方题解

力扣提供了四种题解,我们一种一种来看(终于体会到一道算法题,一看一下午的感觉了)

方法一:横向扫描

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 index = 0;
        while (index < length && str1.charAt(index) == str2.charAt(index)) {
            index++;
        }
        return str1.substring(0, index);
    }

看完这段代码,脑袋里冒出两句话:层层套娃但是妙啊,可我也确实想不到啊

这种方法只能靠积累了,反正我是想不到的(而且我也解释不来,所以大家自己看吧)

方法二:纵向扫描

 public String longestCommonPrefix(String[] strs) {
        if (strs == null || strs.length == 0) {
            return "";
        }
        int length = strs[0].length();
        int count = strs.length;
        for (int i = 0; i < length; i++) {
            char c = strs[0].charAt(i);
            for (int j = 1; j < count; j++) {
                if (i == strs[j].length() || strs[j].charAt(i) != c) {
                    return strs[0].substring(0, i);
                }
            }
        }
        return strs[0];
    }

作者:力扣官方题解
链接:https://leetcode.cn/problems/longest-common-prefix/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这种方法和我的思路有异曲同工之妙,但我的方法更复杂一些

其实我一开始写的代码和官方题解挺像的,下面是我一开始提交的代码

class Solution {
    public String longestCommonPrefix(String[] strs) {
String s = "";
        for (int j = 0; j < strs[0].length(); j++) {
            for (int i = 1; i < strs.length; i++) {
                if (strs[0].charAt(j) != strs[i].charAt(j)) {
                    return s;
                }
            }
            s += strs[0].charAt(j);
        }
        return s;
    }
}

但是我没有考虑到i == strs[j].length()的情况,所以提交的时候代码执行出错了,还是思维不够严谨导致的

方法三:分治

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if (strs == null || strs.length == 0) {
            return "";
        } else {
            return longestCommonPrefix(strs, 0, strs.length - 1);
        }
    }

    public String longestCommonPrefix(String[] strs, int start, int end) {
        if (start == end) {
            return strs[start];
        } else {
            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);
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/longest-common-prefix/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

方法四:二分查找

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if (strs == null || strs.length == 0) {
            return "";
        }
        int minLength = Integer.MAX_VALUE;
        for (String str : strs) {
            minLength = Math.min(minLength, str.length());
        }
        int low = 0, high = minLength;
        while (low < high) {
            int mid = (high - low + 1) / 2 + low;
            if (isCommonPrefix(strs, mid)) {
                low = mid;
            } else {
                high = mid - 1;
            }
        }
        return strs[0].substring(0, low);
    }

    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;
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/longest-common-prefix/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SAP MM 中的业务伙伴确定配置

这篇博客文章将概述 SAP MM 供应商帐户组中的合作伙伴确定是什么以及如何在 S/4 系统中配置它。 本文将指导您完成分步过程&#xff0c;并为您提供有关在供应商主数据中使用合作伙伴确定的完整想法。 合作伙伴角色 供应商在 SAP 中扮演着不同类型的角色&#xff0c;让我们通…

基于JavaSwing实现的学生管理系统(课程设计必备)

基于JavaSwing实现的学生管理系统&#xff0c;最全的Java基础学生管理系统&#xff0c;Java课程设计必备 系统一共包括学生信息管理&#xff0c;考勤签到管理&#xff0c;学生成绩管理&#xff0c;学生选课管理系统。不仅有基础功能&#xff0c;还有图表统计等功能。功能是非常…

记录 | chrome下载提速

chrome浏览器下载提速的方法&#xff1a; 谷歌浏览器一直都带有多线程下载模式&#xff0c;只不过默认关闭了&#xff0c;打开后下载速度会提升很多&#xff0c;只要在新标签页输入 chrome://flags/#enable-parallel-downloading &#xff0c;点enter&#xff0c;出现下图点击…

逆向修改Unity的安卓包资源并重新打包

在上一篇文章中,我已经讲过如何逆向获取unity打包出来的源代码和资源了,那么这一节我将介绍如何将解密出来的源代码进行修改并重新压缩到apk中。 其实在很多时候,我们不仅仅想要看Unity的源码,我们还要对他们的客户端源码进行修改和调整,比如替换资源,替换服务器连接地址…

智能优化算法应用:基于梯度算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于梯度算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于梯度算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.梯度算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

Beam Search学习

BackGround 在生成的时候&#xff0c;模型的输出是一个时间步一个时间步依次获得的&#xff0c;而且前面时间步的结果还会影响后面时间步的结果。也就是说&#xff0c;每一个时间步&#xff0c;模型给出的都是基于历史生成结果的条件概率。 为了生成完整的句子&#xff0c;需…

Codeforces Round 913 (Div. 3) A~E

目录 A. Rook 问题分析: B. YetnotherrokenKeoard 问题分析: C. Removal of Unattractive Pairs 问题分析: D. Jumping Through Segments 问题分析: E. Good Triples 问题分析: A. Rook 问题分析: 给一个棋子将其同行同列的位置输出 #include<bits/s…

ABAP 字符串空白值保留长度或者用其他字符替代

保留空白值在字符串的长度。 DATA lv_char1 TYPE string VALUE Hello. DATA lv_char2 TYPE string VALUE World. DATA LV_CHAR3 TYPE C LENGTH 50.DATA(lv_string3) |{ lv_char1 } { lv_char2 }!|.WRITE: / lv_string3.DATA(lv_string2) lv_char1 && | { lv_char3 } …

6个实用又好用的交互原型工具!

在 UI/UX 设计中&#xff0c;原型设计是至关重要的一步。正如用户体验中的其它环节一样&#xff0c;有无数的交互原型工具可以帮助你完成原型设计。市场上有太多的交互原型工具&#xff0c;如果你不知道选择哪一种&#xff0c;那么我们将为你介绍 6 个实用又好用的交互原型工具…

获取文本框中录入得 方法,执行该方法

最近一个同事问我如何将大文本中输入得方法&#xff0c;变成一个真正得方法执行&#xff0c; 于是在控制台临时测试了一下我的想法 解释一下这个过程&#xff0c; 1、从大文本框中获取到一个字符串 var a"function(){alert(2)}" 2、将字符串转换成真正可执行的方…

半导体湿法清洗工艺

随着技术的不断变化和器件尺寸的不断缩小&#xff0c;清洁过程变得越来越复杂。每次清洗不仅要对晶圆进行清洗&#xff0c;所使用的机器和设备也必须进行清洗。晶圆污染物的范围包括直径范围为0.1至20微米的颗粒、有机和无机污染物以及杂质。 清洁方法可分为湿法或干法。湿法清…

在Linux系统中更换yum源为阿里云

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

html和css小练习

目录 1、css代码 2、html代码 效果图 彩妆热卖产品列表 1、css代码 body {background-color: rgb(238, 231, 225);}* {padding: 0;margin: 0;list-style: none;text-decoration: none;}div {width: 400px;margin: 60px auto;}li {line-height: 40px;border-bottom: 1px das…

AI文本生成工具-免费AI文本生成软件

在当今数字时代&#xff0c;人工智能技术的快速发展不仅改变了我们的生活方式&#xff0c;还在创作领域崭露头角。其中&#xff0c;AI文本生成技术的迅猛发展引起了广泛关注。本文将深入探讨AI文本生成的方法、工具以及一些关键技巧&#xff0c;帮助读者更好地了解并利用这一前…

QT图标工具

Qt图标工具 1.开发环境&#xff1a; Qt5.12.9 vs2019 涉及QT内容&#xff1a; qss: Model/view 使用QListView来显示图标。 使用Model&#xff08;继承QAbstractListModel&#xff09;访问图片列表。 使用FilterModel&#xff08;继承QSortFilterProxyModel&#xff09;来过滤…

智能化转型比想象中更难,九牧智能马桶深陷口碑危机

智能化浪潮正深刻改变着消费者日常生活的方方面面&#xff0c;也推动着传统卫浴品牌面向智能化转型的步伐。 而在一众耳熟能详的中国卫浴品牌中&#xff0c;九牧可以称得上是面向数字化、智能化、高端化转型的先锋。 就在近日&#xff0c;九牧刚刚举行了一场盛大的第1000万套…

Windows 10 11黑屏死机的修复经验分享

1. 执行快速重启 有时,您所需要的只是重新启动。 您可能会惊讶地发现,只需快速重新启动即可解决 Windows 操作系统上的许多问题,尤其是在系统已经运行了一段时间的情况下。 因此,在进行任何复杂的操作之前,请重新启动电脑,看看它是否修复了电脑上的黑屏错误并使一切恢复…

1.1 计算机和编程语言

计算机与编程语言的用处 计算机与大家的生活息息相关&#xff0c;例如银行的ATM机就是计算机、日常使用的手机等。大家大部分情况都是使用现有的软件&#xff0c;只有在特定场景、特定需求的环境下才会编写软件 课程目的 计算机是怎么工作的计算机擅长干什么&#xff0c;计算…

【STM32】小车

一、安装及基本技能 1.环境安装 MDK的下载与安装&#xff1a; 下载链接&#xff1a;Arm Keil | Keil STM32G0xx_DFP 【STM32】两个版本MDK搭建和三种调试器的使用-CSDN博客 安装完MDK后要导入MDK Keil中 导入下载的MDK【记得保存路径中不要有中文】 安装DFP包提示SVDConv …

数字堡垒:上海迅软科技揭示企业数据安全的几大守护方式

在数字化时代&#xff0c;数据已成为许多企业宝贵的资产。对企业而言&#xff0c;如何保护企业的数据安全是至关重要的一件事。但是&#xff0c;数据同时也面临着许多安全威胁&#xff0c;如数据泄露、数据损坏、盗窃等。而企业失去数据或数据遭到未经授权的访问都可能导致严重…