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()
这个函数:
先选取 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);
};
然而这种做法是错误的:
错误的原因也很明显:输入的用例是 [""]或["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
【更新结束】
有关参考
更新:2021年9月26日22:57:34
参考:Array.prototype.every() - JavaScript | MDN
参考:Array.prototype.slice() - JavaScript | MDN