图解LeetCode14:最长公共前缀(递归,二分查找)

2023-11-03

LeetCode14:最长公共前缀

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

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

示例:

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

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

思路1:

递归法

我们可以采用各个字符进行比较,比如:将待比较的最大公共前缀为strs[0],就是flowers,然后与strs[1]相比,flowers和flow的公共前缀为flow,则更新公共前缀为flow,再与flight相比,公共前缀为f,则返回f。
在这里插入图片描述

如果再第一次比较,比如dog和racecar相比没有公共前缀,则直接返回"",不用再往下遍历
在这里插入图片描述

解法1:

public String longestCommonPrefix(String[] strs){
    // 如果传入参数strs为空,返回""
    if(strs == null || strs.length == 0) return "";

    // 将第一个元素作为初始公共字串
    String commonPrefix = strs[0];
    // 遍历strs,比较公共字串
    for (int i = 1; i < strs.length; i++) {
        int j = 0;
        // 遍历第i个元素字符串
        while(j < strs[i].length() && j < commonPrefix.length() ){

            if (strs[i].charAt(j) != commonPrefix.charAt(j)) commonPrefix = strs[i].substring(0,j);
            j ++;
        }
    }
    return commonPrefix;
}

思路2:

二分法

可以按照二分法,逐渐的将公共前缀分割,判断是否所有的元素都是以该前缀开头,如果不是,将公共前缀往前继续二分分割,如果是,将公共前缀往后继续二分分割,直到满足最长的公共前缀要求
在这里插入图片描述

其实在二分查找最长公共前缀的时候,应该选择最短的那个作为初始公共前缀,因为公共前缀的数值不可能超过最短的那个,所以就是以flow作为初始公共前缀进行二分查找
在这里插入图片描述

解法2:

public String longestCommonPrefix2(String[] strs){
    // 如果传入参数strs为空,返回""
    if(strs == null || strs.length == 0) return "";
    // 找到最短的字符串
    String prefix = "";
    int minLen = strs[0].length();
    for (String str : strs) {
        if (str.length() <= minLen){
            minLen = str.length();
            prefix = str;
        }
        minLen = Math.min(minLen, str.length());
    }
    // 作为二分查找的索引,当左边大于了右边,证明二分查找结束
    int low = 0, high = minLen;
    // 是否strs全部匹配
    boolean isCommon = true;
    // 结果
    String res = "";
    while(low < high){
        // 找到二分值
        int mid = (high - low + 1) / 2 + low;
        res = prefix.substring(0, mid);
        isCommon = true;
        // 遍历所有数值
        for (String str : strs) {
            // 元素是否全部以前缀开头
            if (!str.startsWith(res)) {
                isCommon = false;
                high = mid - 1;
                break;
            }
        }
        if (isCommon) low = mid;
    }
    // 退出循环再次最后一次更新mid
    int mid = (high - low + 1) / 2 + low;
    res = prefix.substring(0, mid);
    return res;
}

测试

public static void main(String[] args) {
LeetCode14 lc = new LeetCode14();
        System.out.println(lc.longestCommonPrefix(new String[]{"flowers", "flow", "flight"}));
        System.out.println(lc.longestCommonPrefix2(new String[]{"flowers", "flowww", "flowight"}));
    }

结果

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

图解LeetCode14:最长公共前缀(递归,二分查找) 的相关文章

  • sigmoid和tanh求导的特殊技巧

    1 sigmoid 函数 f z 1 1 exp z 导数 f z f z 1 f z 2 tanh 函数 f z tanh z 导数 f z 1 f z 2
  • 『力扣每日一题08』验证回文串

    一 题目 如果在将所有大写字符转换为小写字符 并移除所有非字母数字字符之后 短语正着读和反着读都一样 则可以认为该短语是一个 回文串 字母和数字都属于字母数字字符 给你一个字符串 s 如果它是 回文串 返回 true 否则 返回 false

随机推荐

  • pycharm界面无法正常弹出

    方法二 快捷键打开 将鼠标放在任务栏上 选中Pycharm图标 采用软件最大化快捷键alt 空格 X即可 或者alt 空格 在弹出窗口的选项中选择最大化
  • Shell中各种括号的作用:()、(())、[]、[[]]、{}、>、>>、$()、${}

    字符串比较 str1 str2 检查str1是否和str2相同 str1 str2 检查str1是否和str2不同 str1 lt str2 检查str1是否和str2小 str1 gt str2 检查str1是否和str2大 n str1
  • 使用idea时,光标变成了不能按空格键,只能修改的vim格式,怎么切换回正常光标

    情况1 你可能不小心启用了 IntelliJ IDEA 中的 Vim 插件 你可以尝试以下步骤来禁用它 在 IntelliJ IDEA 中 选择 File gt Settings 如果你在 macOS 上 选择 IntelliJ IDEA
  • 《计算机视觉中的多视图几何》笔记(3)

    3 Projective Geometry and Transformations of 3D 这章主要讲的是3D的射影几何 与2D的射影几何差不多 主要区别是 3D射影几何对偶的是点和平面 直线是自对偶的 3D空间中直线有4个自由度 这一
  • CTF—Python爬虫-WEB目录爆破和指纹识别

    编写自己的web目录爆破脚本 首先我们要准备一个字典 用来爆破web目录 而且为了使扫描效果好一点 这个字典里面的内容几乎都是dedecms可能的目录 其实要实现这个功能 原理很简单 只用读取字典文件中的每一项 与访问的url拼接成一个新的
  • ObiRope的一些笔记

    之前用ObiRope做的两个小功能 分别是绳子剪裁以及绳子拖拽 但是项目没做完 公司黄了 记录一下相关的笔记 ObiRope下载 链接 https pan baidu com s 1D6330eonD4SALxTOJ2a bg 提取码 hg
  • 获取网络,本地连接的具体名称(Friendly Name)

    工作需要 程序需要 以下代码可以得到 本地连接的具体名称 在VC 6 0下需安装sdk 添加 以下代码 include
  • Android游戏开发中的优化策略

    绘图优化 1 脏矩形 每次都重绘整个背景图 其实是非常浪费的 前后两帧的图其实只有很少的一部发生了变化 因此可以只重绘变化的部分 这是一种常用的绘图优化方式 需要注意的是 android用了双缓冲 也就是说 使用脏矩形的时候 需要连续绘制两
  • TensorFlow低版本安装

    更新pip pip install upgrade pip 查看已有的环境 conda env list 激活环境与取消环境 To activate this environment use conda activate tensorflo
  • 卷积神经网络CNN原理+代码(pytorch实现MNIST集手写数字分类任务)

    目录 卷积神经网络 前言 卷积运算 卷积运算中几个常用的参数 1 padding 2 stride 3 Max Pooling Layer 实战演练 设计一个卷积神经网络 GPU的使用 整体代码 运行结果 卷积神经网络 前言 若将图像数据输
  • git clone no matching host key type found. Their offer: ssh-rsa,ssh-dss... 报错

    Unable to negotiate with 主机地址 port 端口号 no matching host key type found Their offer ssh rsa ssh dss fatal Could not read
  • 红黑树与平衡二叉树区别?

    如果说平衡二叉树是一个类的话 那么红黑树就是该类的一个实例 算法的书我丢久了 一下子也找不到 我是凭记忆说的 红黑树的算法比较麻烦 但它的思想很好 如果理解了它的思想也就理解它的算法 我也只记得思想 具体算法记不得了 我就在这说说思想吧 红
  • oracle归档空间满且启动报错总结

    oracle归档空间满且启动报错总结 今天oracle数据库归档日志过满导致oracle数据库挂掉 解决思路 删除归档日志 看oracle能否可用 如果不可用重启oracle数据库 并把归档关掉 测试库 生产库一定要起归档 在重启数据库的过
  • WIN32 消息总结

    1 键盘消息 键盘会产生如下两种消息 1 按键消息 消息分类 WM KEYDOWN WM KEYUP WM SYSKEYDOWN 系统按键按下时产生 如ALT F10 WM SYSKEYUP 参数 WPARAM 按键的vritual key
  • 【JMeter-Hive】使用JMeter对Hive的查询性能进行压测

    JMeter Hive 使用JMeter对Hive的查询性能进行压测 1 生成测试数据 2 查询性能压测 2 1 创建线程用户并指定参数配置 2 2 创建JDBC Connection Configuration并配置连接信息 2 3 导入
  • C语言题目代码总结解析

    目录 简单版三子棋实现 简单的扫雷的实现 简单的通讯录实现 最大公约数 辗转相除法 判断一个数是否是素数 二分查找 有序数组查找 递归实现字符串反转 递归实现汉诺塔问题 青蛙跳台阶问题 几个字符串库函数的实现 qsort的冒泡实现版本 杨式
  • 用代码写出浪漫__合集(python、matplotlib、Matlab、java绘制爱心、玫瑰花、前端特效玫瑰、爱心)

    活动地址 CSDN21天学习挑战赛 用代码写出浪漫合集 爱心 玫瑰花 本文目录 一 前言 二 用python matplotlib Matlab java绘制爱心 1 爱心图形1 弧线型 显示的文字写在代码里 2 爱心图形2 直线型 显示的
  • openeuler 欧拉操作系统的几个图形界面安装方法

    欧拉操作系统openeuler 安装的时候默认是不带图形界面的 安装完成后如果要使用图形需要手工往系统里面补 目前为止最新的21 09版本ISO安装完后在线源配置里面EPOL源路径是错误的 需要手工修改一下路径 否则是无法更新源里面的软件包
  • let和const 和var 的区别

    1 let和const是什么 声明变量或声明常量l var声明变量 let 代替var 声明变量 const声明常量constant 2 let和const的用法 var一样 var username Alex let age 18 con
  • 图解LeetCode14:最长公共前缀(递归,二分查找)

    LeetCode14 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀 如果不存在公共前缀 返回空字符串 示例 输入 strs flowers flow flight 输出 fl 输入 strs dog racecar car 输