【算法-LeetCode】14. 最长公共前缀(字符串;数组方法Array.every)

本文介绍了如何使用JavaScript的Array.every方法解决LeetCode中的最长公共前缀问题。作者首先分享了错误的解决方案,即在没有检查字符串长度的情况下使用every,导致可能的死循环。然后,通过添加额外的条件避免了这个问题,实现了正确的最长公共前缀函数。最后,文章提到了官方题解,并给出了执行时间和内存消耗。
摘要由CSDN通过智能技术生成

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

发布:2021年9月26日22:50:23

问题描述及示例

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。

示例 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”

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

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

提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成

我的题解

这道题目是我在iPad上做的,第一次用iPad的虚拟键盘敲代码,还挺有新意的,但是还是有点自己给自己找麻烦的感觉,下次还是不要这样了……😂

总体思路还是比较简单的,前提是知道 Array.prototype.every() 这个函数:

参考:Array.prototype.every() - JavaScript | MDN

先选取 strs[0] 作为参照点,再用一个指针 p 来标识当前遍历的字符在相应字符串的下标,每次移动 p 指针后都要判断指针指向的当前字符是否也在其他字符串中的相同位置,而且只要有一个不符合该条件就停止遍历,此时,strs[0]0 ~ p-1 位置上的子字符串就是我们要求的最长公共前缀。

成功前的尝试

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
  let p = 0;
  while(strs.every(cur => cur[p] === strs[0][p])) {
    p++;
  }
  return strs[0].slice(0, p);
};

然而这种做法是错误的:

在这里插入图片描述

当strs的长度为1或是strs中的所有元素都相等时就会陷入死循环从而导致超时

错误的原因也很明显:输入的用例是 [""]或["a"]或["ac"] 这类 strs 中只有一个元素或是 ["aa", "aa", "aa"] 这类 strs 中的所有元素都相等时,就会导致那个 while 循环中的判断语句始终为 true,使得程序陷入死循环,从而导致超时。

我的题解(Array.every)

解决办法也很简单,就是给判断条件增加一个条件:p < strs[0].length,这样就能保证循环能够及时终止。

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
  let p = 0;
  while(strs.every(cur => cur[p] === strs[0][p] && p < strs[0].length)) {
    p++;
  }
  return strs[0].slice(0, p);
};


提交记录
123 / 123 个通过测试用例
状态:通过
执行用时:68 ms, 在所有 JavaScript 提交中击败了94%的用户
内存消耗:38.4 MB, 在所有 JavaScript 提交中击败了84%的用户
时间:2021/09/26 20:12

这种利用现成API的做法还是有点作弊的,但是不用API的话我能想到的方案其实也是差不多的思路,所以就不再扩展了。

官方题解

更新:2021年7月29日18:43:21

因为我考虑到著作权归属问题,所以【官方题解】部分我不再粘贴具体的代码了,可到下方的链接中查看。

更新:2021年9月26日22:56:47

参考:最长公共前缀 - 最长公共前缀 - 力扣(LeetCode)

【更新结束】

有关参考

更新:2021年9月26日22:57:34
参考:Array.prototype.every() - JavaScript | MDN
参考:Array.prototype.slice() - JavaScript | MDN

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值