本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
输入: strs = ["flower","flow","flight"]
输出: "fl"
解题思路
思路一
我们先任意取字符串数组中的一个字符串,默认取字符串数组中第一个,然后把取出来的字符串当作用来比较的标记字符串,然后拿标记字符串和字符串数组中的每一个字符串去比较,如果在字符串数组中发现有任何一个字符串截取的前缀(和标记字符串等长)和标记字符串不相同,我们就把标记字符串缩短一个字符,再进行和字符串数组的每个字符串进行比较,如此往复,这里我们可以使用数组的原生方法some,作用是看数组有有没有复合条件的数组项,如果有返回ture,否则返回false,也可以用every去代替some,不过需要进行取反
var longestCommonPrefix = function(strs) {
if(!strs.length) return ''
let flag = strs[0]
while(strs.some(str=>(str.slice(0,flag.length)!==flag))){
flag = flag.slice(0,flag.length-1)
}
return flag
};
思路二
我们先用数组的第一个字符串为基准进行遍历,第一层循环是首个字符串的长度,第二层循环是数组的长度,如果首个字符串的首个字母与二个字符串的首字母相同,则继续遍历数组的下一项的对应字母,如果不同,则返回首个字符串的[0, j]处的字符串, 如果全部字符串相同,则循环不会走到if语句的return,也就没有返回值,当函数执行到循环的最外层时,就说明当前数组的所有元素都相同,则返回数组的首个字符串即可
var longestCommonPrefix = function (strs) {
if (strs.length === 0) return '';
for (let j = 0; j < strs[0].length; j++) {
for (let i = 0; i < strs.length - 1; i++) {
if (strs[i][j] !== strs[i + 1][j]) return strs[0].slice(0, j);
}
}
return strs[0];
};