Leetcode刷题-最长公共前缀

2023-11-04

Leetcode刷题-最长公共前缀

简介

最近尝试下大家口口相传的神器 leetcode-cn.com,大家自己注册就可以选择题库进行使用了。我都会先自己出一个答案,然后再学习别人的标准答案,进行自我提升。

题目

题目

个人答案及结果

我直接把相关注释再代码体现出来

    public static void main(String[] args) {
        String[] strs = {"flower", "flow", "flight"};
        System.out.println("结果:" + longestCommonPrefix(strs));
    }

    public static String longestCommonPrefix(String[] strs) {
        //用来作为返回公缀使用
        //数组数量不固定,也没有next方法,只能与上一个进行比较
        String last = null;
        //防止数组空
        if (strs.length == 0) {
            return "";
        }
        //遍历数组
        for (String str : strs) {
            //字符串操作方便
            StringBuffer a = new StringBuffer();
            //数组第一个元素没有上一个,不进行比较,直接跳过,防止数组只有一个元素,所以直接给公缀赋值
            if (last == null) {
                last = str;
            } else {
                //字符串遍历操作
                char[] ca = last.toCharArray();
                char[] cb = str.toCharArray();
                //以短的为准,防止越界
                int length = ca.length < cb.length ? ca.length : cb.length;
                for (int i = 0; i < length; i++) {
                    //因为需求是前缀,第一个都不同后面就免了
                    if (i == 0 && ca[i] == cb[i]) {
                        a.append(ca[i]);
                    }
                    //防止出现间隔相同这种情况,如: abc ,adc这种。
                    else if (ca[i] == cb[i] && a.length() == i) {
                        a.append(ca[i]);
                    } else {
                        break;
                    }
                }
                //赋值
                last = a.toString();
            }
        }
        return last;
    }

执行结果

学习一下官方的

了不得啊,官方给了三种方案 最长公共前缀-官方答案(视频)
简单介绍一下

  1. 水平扫描法,就是我上面写的
    在这里插入图片描述

  2. 分治法
    先遍历前半部分,后遍历后半部分
    在这里插入图片描述
    代码


    /**
     * 分治法(先遍历前半部分,后遍历后半部分)
     */
    public static String longestCommonPrefix2(String[] strs) {
        //防止数组空
        if (strs.length == 0) {
            return "";
        }
        //用来作为返回公缀使用
        //数组数量不固定,也没有next方法,只能与上一个进行比较
        //数组前半部分的结果
        String last = commonPrefix(strs, 0, strs.length / 2);
        if (last.equals("")) {
            return "";
        }
        //数组后半部分的结果
        String next = commonPrefix(strs, strs.length / 2, strs.length - 1);
		//两个结果比较
        return commonPrefix(new String[]{last, next}, 0, 1);
    }
public static String commonPrefix(String[] strs, int begin, int end) {
        String last = strs[begin];
        //遍历数组,与上一个进行比较,所以从第二个开始
        for (int a = begin + 1; a <= end; a++) {
            //字符串操作方便
            StringBuffer common = new StringBuffer();

            //字符串遍历操作
            char[] ca = last.toCharArray();
            char[] cb = strs[a].toCharArray();
            //以短的为准,防止越界
            int length = ca.length < cb.length ? ca.length : cb.length;
            for (int i = 0; i < length; i++) {
                //因为需求是前缀,第一个都不同后面就免了
                if (i == 0 && ca[i] == cb[i]) {
                    common.append(ca[i]);
                }
                //防止出现间隔相同这种情况,如: abc ,adc这种。
                else if (ca[i] == cb[i] && common.length() == i) {
                    common.append(ca[i]);
                } else {
                    break;
                }
            }
            //赋值
            last = common.toString();
        }
        return last;
    }


  1. 二分法
    找到最短的字符串,分为两个字符串,分别与所有字段比较
    /**
     * 二分法官方(找到最短的字符串,分为两个字符串,分别与所有字段比较)
     */
    public static String longestCommonPrefix4(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 static 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;
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Leetcode刷题-最长公共前缀 的相关文章

  • java.lang.NoClassDefFoundError: javax/ws/rs/core/Configuration

    我正在实现轻松的网络服务 并且正在使用 jboss 4 0 但我遇到以下异常 java lang NoClassDefFoundError javax ws rs core Configuration 我的 web xml 是
  • 我可以为 Spring Boot 应用程序创建多个入口点吗?

    In 春季启动 需要指定一个主类 它是应用程序的入口点 通常 这是一个具有标准 main 方法的简单类 如下所示 SpringBootApplication public class MySpringApplication public s
  • Maven 配置文件相当于 Gradle

    我试图在我的 spring boot 项目构建中实现一个简单的场景 包括 排除依赖项以及根据环境打包 war 或 jar 例如 对于环境dev包括开发工具和包 jar 用于prod包战等 我知道它不再是基于 XML 的配置 我基本上可以在
  • 如何解析比 Java 中 NumberFormat 更严格的数字?

    我正在验证表单中的用户输入 我解析输入NumberFormat http docs oracle com javase 7 docs api java text NumberFormat html 但它是邪恶的 几乎允许任何事情 有没有办法
  • 如何在 Spring Boot 1.4 中自定义 Jackson

    我一直无法找到如何使用的示例Jackson2ObjectMapperBuilderCustomizer java在spring boot 1 4中自定义Jackson的功能 boot 1 4 中自定义 Jackson 的 doco http
  • 使 TreeMap 比较器容忍 null

    这个定制的 Valuecomarator 按其值对 TreeMap 进行排序 但在搜索 TreeMap 是否具有某个键时 它不能容忍 nullpointException 如何修改比较器来处理零点 import java io IOExce
  • SwingWorker 在 Unsafe.park() 处挂起

    我有一个SwingWorker与后台服务器通信 然后更新JFrame 我正在调试我的应用程序并注意到即使在SwingWorker完成了它的工作 它的线程仍然存在 它挂在Unsafe park java lang Object 这是一个本机方
  • UiBinder 中的 gwt 按钮

    我需要创建一个按钮 所以它是一个带有图像的按钮 gwt with UiBinder 但我不确定如何进行 这是我的ui xml code
  • 全屏独占模式下的 AWT 框架在窗口弹出对话框中最小化

    我正在开发一个在全屏独占模式下使用 awt 框架的应用程序 一切正常 直到弹出窗口可见 这会抢走焦点 我的应用程序将被最小化 这是我的框架的初始化代码 if ApplicationConfig getInstance useFullscre
  • Selenium Webdriver 中显式等待 findElements

    登录后 页面重定向到一个页面 我想等待页面加载 我在其中按 tagName 查找元素 By inputArea By tagName input List
  • 找不到模块:javafx.controls

    我已经下载了JavaFX SDK 解压它并设置PATH TO FX系统变量 如下本说明 https openjfx io openjfx docs install javafx 我使用了以下代码示例 import javafx applic
  • Maven:缺少工件 org.springframework:spring:jar:4.2.6

    我在 SpringToolSuite 中有一个动态 Web 项目 它被转换为 Maven 项目 我遇到问题 缺少工件 org springframework spring jar 4 2 6 我已经尝试清理 重建和运行该项目 它给 读取文件
  • Apache POI 的 ProGuard 设置

    我正在构建一个使用 Apache POI 库的应用程序 当我调试应用程序 在不运行 Proguard 的情况下编译它 时 一切都运行良好 但是在导出 APK 后 当我运行应用程序并打开 Excel 文件时 出现以下异常 RuntimeExc
  • 内容安全策略:页面设置阻止自行加载资源?

    我有基于 Java 的 Web 应用程序运行在Tomcat http en wikipedia org wiki Apache Tomcat6 我的应用程序在本地主机和端口 9001 上运行 为了使我的应用程序更加安全并降低风险XSS ht
  • 用 Java 捕获扬声器输出

    使用Java可以捕获扬声器输出吗 此输出不是由我的程序生成的 而是由其他正在运行的应用程序生成的 这可以用 Java 完成还是我需要求助于 C C 我有一个基于 Java 的应用程序 使用过的爪哇声音 https stackoverflow
  • 在 jFrame 中启用右键单击

    嘿 我正在寻找如何使用 NetBeans 在 jFrame 中启用 仅且仅 右键单击并显示弹出菜单 使用我的代码 private void formMouseClicked java awt event MouseEvent evt pop
  • 为什么 Libgdx 的 Table 不接受缩放操作?

    我在 libgdx 库中使用 scene2d 在游戏中创建一些 UI 我使用了一个表格 我想在用户触摸时采取一些缩放操作以使按钮触摸有意义 当我使用任何其他 Actor 类型 例如 Group 并为其提供缩放操作时 它可以工作 但不能工作表
  • Java可以进行进程监控吗?

    是否可以用Java编写一个在托盘中运行的应用程序 并且当启动某个应用程序时 它可以检测到它 我想对某些程序执行此操作 以了解我每周使用它们多长时间 我是 Java 新手 所以我不知道 Java 是否是最适合此操作的语言 或者它是否具有对操作
  • 在 Java Web 应用程序中获取 DataSource 资源

    我的 context xml 文件中有以下资源标记
  • 在私有 guice 模块中公开 Map

    我在 guice 中有一个 PrivateModule 我想从该模块公开一个 Map public class TestInjectionModule extends PrivateModule expose Map class annoa

随机推荐

  • element ui 前台模板_一个干净优雅的Element UI Admin模板

    Element UI Admin 一个干净优雅的Element UI Admin模板 一个大型单页应用离不开合理的项目结构和一些简单的封装 Start 克隆或者下载这个仓库 进入项目目录安装依赖 yarn Develop serve wit
  • python:基于朴素贝叶斯算法的垃圾邮件过滤分类

    目录 一 朴素贝叶斯算法 1 概述 2 推导过程 二 实现垃圾邮件过滤分类 1 垃圾邮件问题背景 2 朴素贝叶斯算法实现垃圾邮件分类的步骤 3 python实现 参考学习网址 https blog csdn net weixin 59450
  • Nacos适配Oracle12c【亲测可用、保姆级教学】

    Nacos适配Oracle12c 前言 内容准备 数据SQL 源码项目 项目初始化 提取Nacos启动包 启动Nacos 尝试访问 其他问题 IDEA 报错找不到符号com alibaba nacos consistency entity
  • 华为OD机试 - 字符串加密(C++ & Java & JS & Python)

    描述 有一种技巧可以对数据进行加密 它使用一个单词作为它的密匙 下面是它的工作原理 首先 选择一个单词作为密匙 如TRAILBLAZERS 如果单词中包含有重复的字母 只保留第1个 将所得结果作为新字母表开头 并将新建立的字母表中未出现的字
  • 局域网IP地址不够用怎么办?快速解决局域网IP地址不够用

    目录 前言 设置局域网的IP地址数量 1 LAN地址设置 2 DHCP服务器设置 增加路由器层级或者使用软路由 通过三层交换机实现VLAN 总结 前言 在网络如此发达的时代 越来越多的设备需要连接网络 特别是当前智能家居 物联网的新型产业的
  • Maven 编译遇到 Process terminated【四种情况全部解决】

    情况一 配置文件 settings xml 出错 解决方法1 1 1 项目编译报错如下 1 2 点击 项目名 提示找到出错文件 1 3 点击查看出错文件 在idea中打开了settings文件 找到提示的报错位置 1 4 原因及解决办法 原
  • Altium中网络标签、端口、离图以及编译范围的设置区别?

    1 Altium Designer多图纸功能 原理图主次分层次 Altium Designer多图纸功能 原理图主次分层次 1 1 各类网络标识符 由于我们使用到多图纸功能 这时需要考虑图纸间的线路连接 在单个图纸中 我们可以通过简单的网络
  • pandas数据处理大全(必备)

    目录 文章目录 目录 pandas读取文件 pandas存储文件 pandas处理空值和缺失值 pandas创建空dataframe dataframe索引值的修改 dataframe选择行与列 dataframe转置 dataframe添
  • Nodejs 中的非阻塞I/O、异步和事件驱动

    前言 Node js使用 事件驱动机制 具有非阻塞的I O模型这样的特点 Node js中的大多数Api都用到了异步函数 那麽又该如何获取异步函数返回的数据呐 废话不多说 来看看本次分享 都有哪些亮点吧 一 Nodejs 的 非阻塞 I O
  • 使用VS2019 开发Linux C++ 程序

    第一步 注 如果Windows下面查询不到dns也可以不设置静态IP地址 直接跳到第二步 1 先将自己的Linux 系统设为静态IP 具体操作如下 修改 etc network interfaces 地址配置文件 如下所示 操作 代码 修改
  • 网络存储ISCSI详解

    一 网络存储 目前应用最为广泛的两种数据存储设备 NAS与SAN 1 NAS NAS的全称是Network attached storage 即网络附加存储 并不需要单独的网络用于存储IO 更适用于中小型的存储解决方案 NAS设备通常是一个
  • 关于PID的输入输出是什么--供自己复习使用

    本人也是个新手 最近对平衡车感兴趣 所以恶补了一些关于pid的知识 下面是关于pid的文章 后续在平衡车上有进展也会出一些关于平衡车的文章 第一次写文章 有许多的不足之处 希望给位网友给予指正 在过程控制中 按偏差的比例 P 积分 I 和微
  • Linux文件解压缩:tar: /xxx: Not found in archive

    因为压缩文件使用的相对路径 如果在解压是使用绝对路径需要加上 C指令 tar zxvf xxx tar gz C usr local apps
  • 5G到底厉害在什么地方?和4G有什么不同?

    5G给大家的第一个印象肯定就是速度很快 秒下电影 这也是媒体大力宣传的一个点 5G的速度的确比4G快了很多 但是5G不仅仅是速度大大提高了 还有其他更重要的优点 不知道你有没有这种感觉 4G的速度已经挺快了啊 我们手机看视频一点都不卡啊 有
  • mpvue中小程序版本更新

    在App vue中 onLaunch if wx canIUse getUpdateManager const updateManager wx getUpdateManager updateManager onCheckForUpdate
  • Server-Sent Events 一种轻量级的Push方式

    文章目录 SSE工作原理 SSE的特点 SSE的推送数据格式 SSE的使用 客户端 服务端 效果展示 简单来说 Server Sent Events 简称SSE 是服务端发送事件 即服务端Push的一种机制 SSE工作原理 一般来说HTTP
  • 封装NavLink组件

    之后可以通过
  • 后继者:找出二叉搜索树中指定节点的“下一个”节点

    后继者 设计一个算法 找出二叉搜索树中指定节点的 下一个 节点 也即中序后继 如果指定节点没有对应的 下一个 节点 则返回null 来源 力扣 LeetCode 链接 https leetcode cn problems successor
  • nextTick 原理及作用

    Vue 的 nextTick 其本质是对 JavaScript 执行原理 EventLoop 的一种应用 nextTick 的核心是利用了如 Promise MutationObserver setImmediate setTimeout的
  • Leetcode刷题-最长公共前缀

    Leetcode刷题 最长公共前缀 简介 题目 个人答案及结果 学习一下官方的 简介 最近尝试下大家口口相传的神器 leetcode cn com 大家自己注册就可以选择题库进行使用了 我都会先自己出一个答案 然后再学习别人的标准答案 进行