14. 最长公共前缀

这个题目花了我很多时间,这里我犯了一个错误,大家能发现吗

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
  if (strs.length === 1) {
      return strs[0];
  }
  let map = new Map();
  strs.forEach((item) => {
      item.split('').forEach(( (it, index) => {
          if(map.has(index)) {
              let arr1 = map.get(index);
              arr1.push(it);
              map.set(index, arr1);
          } else {
              let arr = [];
              arr.push(it);
              map.set(index, arr);
          }
      }))
  })
  let res = '';
  console.log(map)
  map.forEach((item, index) => {
      if (item.length === strs.length) {
        for (let i = 0; i < item.length - 1; i++) {
            if (item[i] !== item[i + 1]) {
              console.log(item[i], item[i + 1]);
              console.log(res);
              return res;
            } else if (i === item.length - 2) {
              res += item[i];
            }
        }
      }
  })
};

let strs = ["flower","flow","flight"];
let a = longestCommonPrefix(strs);
console.log(a);

这个错误就在return这里,我遍历map用的是foreach回调函数,这里的return只是回调函数的return,并不是整个大函数的return 因此这里获取不到结果

回调函数里的return只会终止一次循环,不会影响下一次循环

 最终修改版:

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
  if (strs.length === 0) return "";
  if (strs.length === 1) return strs[0];
  
  let map = new Map();
  strs.forEach((item) => {
      item.split('').forEach(( (it, index) => {
          if(map.has(index)) {
              let arr1 = map.get(index);
              arr1.push(it);
              map.set(index, arr1);
          } else {
              let arr = [];
              arr.push(it);
              map.set(index, arr);
          }
      }))
  })
  let res = '';
  for (let v = 0; v < map.size; v++) {
    let arr = map.get(v);
    if (arr.length === strs.length) {
      for (let i = 0; i < arr.length - 1; i++) {
          if (arr[i] !== arr[i + 1]) {
            return res;
          } else if (i === arr.length - 2) {
            res += arr[i];
          }
      }
    }
  }
  return res;
};

思路: 遍历数组,将每个字符串split切割成数组,遍历这个数组将每个数组第i个元素放入map结构key为i的键值对中,之后遍历map,如果键值对的长度等于输入数组的长度,且键值对的value数组中每个字母都一样就把这个字符记录下来。

其实用二维数组应该也可以实现,但今天没什么时间看了~只能先这样了

我看官方给的答案这个好像叫纵向遍历

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值