热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LeedCode14:最长公共前缀

最长公共前缀题目描述:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串。示例1:输入࿱

最长公共前缀


题目描述:

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

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

示例1:

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

示例2:

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

链接:

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

解题思路

思路一:粗暴循环比较法

/*** @param {string[]} strs* @return {string}*/
var longestCommonPrefix &#61; function (strs) {if (strs.length <&#61; 1) {return strs[0];}var prev &#61; strs[0];var prevLen &#61; prev.length,len &#61; strs.length;for (var i &#61; 1; i };

时间复杂度&#xff1a; O(mn)&#xff0c;其中 m 是字符串数组中的字符串的平均长度&#xff0c;n 是字符串的数量。最坏情况下&#xff0c;字符串数组中的每个字符串的每个字符都会被比较一次   

空间复杂度&#xff1a; O(1)


思路二&#xff1a;仅需最大、最小字符串的最大公共前缀

获取数组中的最大值及最小值字符串&#xff08;字符串比较是根据字符的 Unicode 编码大小逐位比较字符串大小&#xff0c; 可以看Javascript中字符串的比较规则&#xff09;&#xff0c;最小值字符串与最大字符串的最长公共前缀也为其他字符串的公共前缀&#xff0c;即为字符串数组的最长公共前缀。

var longestCommonPrefix &#61; function (strs) {if (strs.length <&#61; 1) {return strs[0];}var min &#61; 0,max &#61; 0;for (var i &#61; 1; i strs[i]) min &#61; i;if (strs[max] };

时间复杂度&#xff1a; O(m &#43; n) , 其中 m 是字符串数组中的最小字符串的长度&#xff0c;n 是数组长度。

空间复杂度&#xff1a; O(1)

思路三&#xff1a;分治

可以将多个字符串的最长公共前缀分解成多个相似的子问题&#xff1a;求两个字符串的最长公共前缀&#xff1b;

LCP(S1, S2, …, Sn) &#61; LCP(LCP(S1, Sk), LCP(Sk&#43;1, Sn))

/*** &#64;param {string[]} strs* &#64;return {string}*/
var longestCommonPrefix &#61; function (strs) {if (strs.length <&#61; 1) {return strs[0];}return longestCommonPrefix(strs);
};// 分裂后数组长度为1&#xff0c;进行比较最长公共前缀
var longestCommonPrefix &#61; function (arr) {var len &#61; arr.length;if (len &#61;&#61;&#61; 1) {return arr[0];}var mid &#61; Math.floor(len / 2);var lcpLeft &#61; arr.slice(0, mid);var lcpRight &#61; arr.slice(mid, len);return commonPrefix(longestCommonPrefix(lcpLeft),longestCommonPrefix(lcpRight));
};// 获取两字符串的最长公共前缀
var commonPrefix &#61; function (lcpLeft, lcpRight) {var minLength &#61; Math.min(lcpLeft.length, lcpRight.length);for (var i &#61; 0; i };

时间复杂度&#xff1a;O(mn)&#xff0c;其中 m 是字符串数组中的字符串的平均长度&#xff0c;n 是字符串的数量。时间复杂度的递推式是 T(n)&#61;2 * T(n / 2) &#43; O(m)&#xff0c;通过计算可得 T(n)&#61;O(mn)

空间复杂度&#xff1a;O(mlogn)&#xff0c;空间复杂度主要取决于递归调用的层数&#xff0c;层数最大为 nlogn&#xff0c;每层需要 m 的空间存储返回结果

思路四&#xff1a;利用Trie树&#xff08;字典树&#xff09;

Trie树&#xff0c; 字典树或前缀树&#xff0c;顾名思义&#xff0c;它是用来处理字符串匹配问题的数据结构&#xff0c;以及用来解决集合中查找固定前缀字符串的数据结构。

解题思路&#xff1a; 构建一个 Trie 树&#xff0c;字符串数组的最长公共序列就为从根节点开始遍历树&#xff0c;直到&#xff1a;

  • 遍历节点存在超过一个子节点的节点
  • 或遍历节点为一个字符串的结束字符

为止&#xff0c;走过的字符为字符串数组的最长公共前缀

var longestCommonPrefix &#61; function (strs) {if (strs.length <&#61; 1) {return strs[0];}// 初始化Trie树var trie &#61; new Trie();// 构建Trie树for (var i &#61; 0; i};
// Trie树
var Trie &#61; function () {this.root &#61; new TrieNode();
}
var TrieNode &#61; function () {// next 放入当前节点的子节点this.next &#61; {};// 当前是否是结束节点this.isEnd &#61; false;
}
Trie.prototype.insert &#61; function (word) {if (!word) {return false;}var node &#61; this.root;for (var i &#61; 0; i }
// 搜索最长公共前缀
Trie.prototype.searchLongestPrefix &#61; function () {var node &#61; this.root, prefix &#61; &#39;&#39;;while (node.next) {var keys &#61; Object.keys(node.next);var key &#61; keys[0];if (keys.length !&#61;&#61; 1) break; // 说明节点不一样了if (node.next[key].isEnd) { // 到头了prefix &#43;&#61; key;break;}prefix &#43;&#61; key;node &#61; node.next[key];}return prefix;
}

时间复杂度&#xff1a;O(s&#43;m)&#xff0c;s 是所有字符串中字符数量的总和&#xff0c;m为字符串数组中最长字符的长度&#xff0c;构建 Trie 树需要 O(s) &#xff0c;最长公共前缀查询操作的复杂度为 O(m)

空间复杂度&#xff1a;O(s)&#xff0c;用于构建 Trie 树

参考资料&#xff1a;

https://github.com/sisterAn/Javascript-Algorithms/issues/19


推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • node.jsurlsearchparamsAPI哎哎哎 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 本文介绍了如何在使用emacs时去掉ubuntu的alt键默认功能,并提供了相应的操作步骤和注意事项。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • python3 nmap函数简介及使用方法
    本文介绍了python3 nmap函数的简介及使用方法,python-nmap是一个使用nmap进行端口扫描的python库,它可以生成nmap扫描报告,并帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。文章详细介绍了python-nmap的几个py文件的功能和用途,包括__init__.py、nmap.py和test.py。__init__.py主要导入基本信息,nmap.py用于调用nmap的功能进行扫描,test.py用于测试是否可以利用nmap的扫描功能。 ... [详细]
author-avatar
阡蓝fliona
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有