面试经典150题——最长公共前缀

面试经典150题 day20

      • 题目来源
      • 我的题解
        • 方法一 横向遍历
        • 方法二 纵向遍历
        • 方法三 分治
        • 方法四 字典树

题目来源

力扣每日一题;题序:14

我的题解

方法一 横向遍历

两两字符串找最长公共前缀

时间复杂度:O(nL)。n表示数组的长度,L表示来两两字符创的最长公共前缀。
空间复杂度:O(1)

public String longestCommonPrefix(String[] strs) {
    String pre=strs[0];
    for(int i=1;i<strs.length;i++){
        pre=pairPrefix(pre,strs[i]);
    }
    return pre;
}
public String pairPrefix(String s1,String s2){
    int i=0;
    while(i<s1.length()&&i<s2.length()&&s1.charAt(i)==s2.charAt(i)) i++;
    return s1.substring(0,i);
}
方法二 纵向遍历

每次判断当前列的 所有字符是否相同

时间复杂度:O(nL)
空间复杂度:O(1)

public String longestCommonPrefix(String[] strs) {
    int i=0;
    for(;i<strs[0].length();i++){
        if(!isPrefixCol(strs,i)){
            return strs[0].substring(0,i);
        }
    }
    return  strs[0].substring(0,i);
}
public boolean isPrefixCol(String[] strs,int index){
    if(index>=strs[0].length())
        return false;
    char c=strs[0].charAt(index);
    for(int i=1;i<strs.length;i++){
        if(index>=strs[i].length())
            return false;
        if(c!=strs[i].charAt(index))
            return false;
    }
    return true;
}
方法三 分治

方法一的优化版本,可以采用分治的思想,找部分的数组的最长公共前缀,然后再找组合起来的最长公共前缀。

时间复杂度:O(nL)
空间复杂度:O(1)

public String longestCommonPrefix(String[] strs) {
    int n=strs.length;
    if(n==1)
        return strs[0];
    return getLongPrefix(strs,0,n-1);
}
public String getLongPrefix(String[] strs,int start,int end){
    if(start>end)
        return "";
    if(start==end)
        return strs[start];
    int mid=((end-start)>>1)+start;
    String left=getLongPrefix(strs,start,mid);
    String right=getLongPrefix(strs,mid+1,end);
    return pairPrefix(left,right);
}
public String pairPrefix(String s1,String s2){
    int i=0;
    while(i<s1.length()&&i<s2.length()&&s1.charAt(i)==s2.charAt(i)) i++;
    return s1.substring(0,i);
}
方法四 字典树

使用所有字符串构建字典树(也叫前缀树),然后在字典树中找到最短的结束位置。

public String longestCommonPrefix(String[] strs) {
    int n=strs.length;
    if(n==1)
        return strs[0];
    //构建字典树并记录最短字符串
    DictTree t=new DictTree();
    int min=Integer.MAX_VALUE;
    int index=0;
    for(int i=0;i<n;i++){
        t.insert(strs[i]);
        if(min>strs[i].length()){
            min=strs[i].length();
            index=i;
        }
    }
    int end=0;
    //在最短字符串中查找最长公共前缀
    for(;end<strs[index].length();end++){
        if(t.count!=1)
            break;
        int chIndex=strs[index].charAt(end)-'a';
        t=t.next[chIndex];
    }
    return strs[index].substring(0,end);
}

class DictTree{
    boolean isEnd;
    DictTree[] next;
    int count;//用于记录某一列是否只有一个字符
    public DictTree(){
        isEnd=false;
        next=new DictTree[26];
        count=0;
    }
    // 插入字符串word
    public void insert(String word){
        DictTree cur=this;
        int n=word.length();
        for(int i=0;i<n;i++){
            int chIndex=word.charAt(i)-'a';
            if(cur.next[chIndex]==null){
                cur.next[chIndex]=new DictTree();
                cur.count++;
            }
            cur=cur.next[chIndex];
        }
        cur.isEnd=true;
    }
    // 查找 word是否在字典树中
    public boolean search(String word){
        DictTree t=searchPrefix(word);
        return t!=null&&t.isEnd;
    }
    // 判断是否有 prefix为前缀的字符串
    public boolean startWithPrefix(String prefix){
        return searchPrefix(prefix)!=null;
    }
    // 查找前缀 prefix的结尾节点
    public DictTree searchPrefix(String prefix){
        DictTree cur=this;
        for(int i=0;i<prefix.length();i++){
            int chIndex=prefix.charAt(i)-'a';
            if(cur.next[chIndex]==null)
                return null;
            cur=cur.next[chIndex];
        }
        return cur;
    }
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

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

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

相关文章

【PyTorch与深度学习】2、PyTorch张量的运算API(上)

课程地址 最近做实验发现自己还是基础框架上掌握得不好&#xff0c;于是开始重学一遍PyTorch框架&#xff0c;这个是课程笔记&#xff0c;这个课还是讲的简略&#xff0c;我半小时的课听了一个半小时。 1. 张量 1.1 张量操作 &#xff08;1&#xff09;chunk&#xff1a;将一…

华为手机ip地址怎么切换

随着移动互联网的普及&#xff0c;IP地址成为了我们手机上网的重要标识。然而&#xff0c;在某些情况下&#xff0c;我们可能需要切换手机的IP地址&#xff0c;以更好地保护个人隐私、访问特定地区的内容或服务&#xff0c;或者出于其他网络需求。华为手机作为市场上的热门品牌…

Kafka客户端工具:Offset Explorer 使用指南

Kafka作为一个分布式流处理平台&#xff0c;在大数据处理和实时数据流应用中扮演着至关重要的角色。管理Kafka的topics及其offsets对于维护系统稳定性和数据一致性至关重要。Offset Explorer是一个强大的桌面应用程序&#xff0c;它使得管理和监控Kafka集群变得简单直观。本文将…

2023 广东省大学生程序设计竞赛(部分题解)

目录 A - Programming Contest B - Base Station Construction C - Trading D - New Houses E - New but Nostalgic Problem I - Path Planning K - Peg Solitaire A - Programming Contest 签到题&#xff1a;直接模拟 直接按照题目意思模拟即可&#xff0c;为了好去…

【Unity】修改模型透明度

在 Unity 中修改模型透明度主要有两种方法&#xff1a;通过材质和通过着色器。以下是两种方法的步骤和解释&#xff1a; 方法 1&#xff1a;通过材质 在 Unity 编辑器中&#xff0c;选择你想要修改透明度的模型。在 Inspector 窗口中&#xff0c;找到模型的 Renderer 组件&am…

海康WEB3.3控件开发包 V3.3 前端vue项目调用实时监控画面

公司业务迭代, 需要前端vue项目里增加一个查看实时监控模块, 这个需求是之前离职的前端小哥没有研究明白的, 现在落在了我的肩上, 压力还是有的. 但是压力归压力, 问题还是要解决的. 一、调研设备和方案 第一步: 调研大佬们已经实现的方案, 找设备对接. 公司后端大佬提出用官…

Jenkins邮件发送失败问题解决

如下提示为 Extended E-mail Notification开启Debug模式下显示的错误信息&#xff0c; (Debug模式设置方法&#xff1a;Dashboard-> manage Jenkins->configure System)DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM XOAUTH2 DEB…

Unity3d 学习之按钮绑定事件

创建测试脚本 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class myTest : MonoBehaviour {// Start is called before the first frame updatepublic Button _codeBindBtn null;void Start(){if (_codeBi…

LeetCode 213 —— 打家劫舍 II

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 此题是 LeetCode 198—— 打家劫舍 的升级版&#xff0c;多了一个首尾相连的设定。 因为首尾相连&#xff0c;所以第一个房屋和最后一个房屋只能偷窃其中一个。 所以&#xff0c;第一种方案就是不偷窃最后一个房…

每日OJ题_DFS爆搜深搜回溯剪枝⑧_力扣980. 不同路径 III

目录 力扣980. 不同路径 III 解析代码 力扣980. 不同路径 III 980. 不同路径 III 难度 困难 在二维网格 grid 上&#xff0c;有 4 种类型的方格&#xff1a; 1 表示起始方格。且只有一个起始方格。2 表示结束方格&#xff0c;且只有一个结束方格。0 表示我们可以走过的空…

HTML5实用大全(Part.1)

引言&#xff1a; 哈喽&#xff0c;各位小伙伴们&#xff0c;在本篇博客我将带领大家走进前端中的HTML5,利用HTML我们将可以在网页上自我创作内容&#xff0c;现在学起来&#xff0c;不久后自己也能制作一个花哨的项目了呢&#xff0c;那么&#xff0c;我们开始吧&#xff01; …

【ROS2学习记录】—— 参考鱼香ROS

1 回顾Linux基础 &#xff08;1&#xff09;打开终端&#xff1a;Ctrl Alt T &#xff08;2&#xff09;ls &#xff08;3&#xff09;cd cd ~ cd /&#xff08;4&#xff09;pwd &#xff08;5&#xff09;mkdir -p catkin_ws/src &#xff08;6&#xff09;rm -rf &#…

LeetCode 198—— 打家劫舍

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 此题使用动态规划求解&#xff0c;假设 d p [ i ] [ 0 ] dp[i][0] dp[i][0] 代表不偷窃第 i i i 个房屋可以获得的最高金额&#xff0c;而 d p [ i ] [ 1 ] dp[i][1] dp[i][1] 代表偷窃第 i i i 个房屋可以获…

【右一的开发日记】全导航,持续更新...

文章目录 &#x1f4da;前端【跟课笔记】&#x1f407;核心技术&#x1f407;高级技术 &#x1f4da;捣鼓捣鼓&#x1f407;小小案例&#x1f407;喵喵大王立大功&#x1f407;TED自用学习辅助网站&#x1f407;世界top2000计算机科学家可视化大屏&#x1f407;基于CBDB的唐代历…

GitHub Copilot 简单使用

因为公司安全原因&#xff0c;并不允许在工作中使用GitHub Copilot&#xff0c;所以&#xff0c;一直没怎么使用。最近因为有一些其它任务&#xff0c;所以&#xff0c;试用了一下&#xff0c;感觉还是很不错的。&#xff08;主要是C和Python编程&#xff09; 一&#xff1a;常…

python中的进程线程和协程

目录 进程&#xff08;Process&#xff09;多进程代码实例 线程&#xff08;Thread&#xff09;多线程存在原因及其缺点多线程代码实例 协程&#xff08;Coroutine&#xff09;协程的优点协程代码实例 进程、线程和协程适合的任务性质和环境多进程更适合的场景多线程更适合的场…

LeetCode 11—— 盛最多水的容器

阅读目录 1. 题目2. 解题思路一3. 代码实现一4. 解题思路二5. 代码实现二 1. 题目 2. 解题思路一 暴力法&#xff0c;遍历所有可能的垂线对 ( i , j ) (i, j) (i,j)&#xff0c;求取最大面积&#xff1a; a r e a m i n ( h [ i ] , h [ j ] ) ∗ ( j − i ) area min(h[i]…

Node.js -- MongoDB

文章目录 1. 相关介绍2. 核心概念3. 命令行交互3.1数据库命令3.2 集合命令3.3 文档命令 4. 数据库应用场景4.1 新增4.2 删除4.3 更新4.4 查询 1. 相关介绍 一、简介 Mongodb是什么 MongoDB是一个基于分布式文件存储的数据库&#xff0c;官方地址https://www.mongodb.com/try/d…

一个C++小程序调试过程记录

Top 20 C Projects With Source Code [2024 Update]https://www.interviewbit.com/blog/cpp-projects/ 这个网页有一些简单的C程序的源码&#xff0c;闲来无事&#xff0c;把第一个程序&#xff08;Bookshop Management System Using C&#xff09;的源码下载了下来。 源文件…

第N1周:one-hot独热编码

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、OneHot独热编码原理 独热编码&#xff08;One-Hot Encoding&#xff09;是一种将分类数据转换为二进制向量的方法&#xff0c;其中每个类别对应一个唯一的…
最新文章