LeetCode [14] 最长公共前缀

146 阅读1分钟

题目地址:最长公共前缀

题目难度:简单

题目描述:

 * 编写一个函数来查找字符串数组中的最长公共前缀。
*
* 如果不存在公共前缀,返回空字符串 ""。
*
* 示例 1:
*
* 输入: ["flower","flow","flight"]
* 输出: "fl"
*
*
* 示例 2:
*
* 输入: ["dog","racecar","car"]
* 输出: ""
* 解释: 输入不存在公共前缀。
*
*
* 说明:
*
* 所有输入只包含小写字母 a-z.

解法一:

var longestCommonPrefix = function (strs) {
  if (strs.length === 0) return '';
  let ret = '';
  for (let i = 0; i < strs[0].length; i++) {
    for (let j = 1; j < strs.length; j++) {
      if (strs[0][i] !== strs[j][i]) {
        return ret;
      }
    }
    ret += strs[0][i];
  }
  return ret;
};

解法二:

var longestCommonPrefix = function (strs) {
  if (!strs.length) return '';
  // 求出字符串长度最短的那一项
  const lengthArr = strs.map((item) => item.length);
  const minLengthIndex = lengthArr.indexOf(Math.min.apply(null, lengthArr));
  let result = strs[minLengthIndex];
  for (let i = 0; i < strs.length; i++) {
    if (i === minLengthIndex) continue;
    for (let j = 0; j < result.length; j++) {
      if (result[j] !== strs[i][j]) {
        // 表示前面已经通过,到这里不相等了 所以就截取之前的字符串 也就是相同的起始子串了
        result = result.substring(0, j);
        break;
      }
    }
  }
  return result;
};

解法三:

var longestCommonPrefix = function (strs) {
  if (strs.length === 0) return '';
  let ret = strs[0];
  for (let i = 1; i < strs.length; i++) {
    // 3. 如果ret已经被截取到空串 那么后续的循环也没必要执行
    if (!ret) return '';
    // 1. 如果 ret 不是当前str的前缀
    while (strs[i].indexOf(ret) !== 0) {
      // 2. 截取最后一个字母 继续比较
      ret = ret.substr(0, ret.length - 1);
    }
  }
  return ret;
};