最长公共前缀

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

示例

输入: ["flower","flow","flight"]
输出: "fl"
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。

题解

// 横向比较
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function(strs) {
if(strs.length === 0) return "";
return strs.reduce( (pre, cur) => {
var tmp = "";
for(let i=0;i<pre.length; ++i){
if(pre[i] === undefined || pre[i] !== cur[i]) break;
else tmp += cur[i];
}
return tmp;
})
};

// 纵向比较
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function(strs) {
var n = strs.length;
var target = "";
var interrupt = false;
var i = -1;
while(true) {
++i;
if(!strs[0]) return "";
var tmp = strs[0][i];
for(let k=0; k<n; ++k){
if(strs[k][i] === undefined || tmp !== strs[k][i]) {
interrupt = true;
break;
}
}
if(interrupt) break;
target = `${target}${tmp}`;
}
return target;
};

思路

横向比较的方法是借助​​Js​​​标准库的​​reduce​​​方法,将每次比较的结果进行返回,作为下一次比较传入函数的第一个参数,第二个参数就是当前的字符串,注意​​reduce​​​方法在没有第三个参数的情况下是以数组中第二个值作为传入函数的第二个参数也就是当前值,也就是说长度为​​n​​​的数组只会计算​​n-1​​​次。纵向比较的方式就是依次比较字符串数组中每个字符,即不断循环比较所有字符串的第​​1​​​、​​2​​​、​​...​​​、​​n​​个字符,在比较的过程中在列中出现不相同的字符即结束循环并返回结果。

每日一题

https://github.com/WindrunnerMax/EveryDay

参考

https://leetcode-cn.com/problems/longest-common-prefix/