前端算法(14)

82 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

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

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

输入: 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];
};