Leetcode 5 最长公共前缀

题目描述

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

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

示例 1:

输入: ["flower","flow","flight"]
输出: "fl"
示例 2:

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

说明:
所有输入只包含小写字母 a-z 。

解法

方法一

暴力解法。双层遍历,第一层遍历字符串,第二层遍历字符串数组,并判断是否存在公共前缀。

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
  let has_common = true;
  const first = strs[0];

  if (first == undefined) return '';

  for (let i = 1; i <= first.length; i++) {
    const str = first.substring(0, i);

    for (let j = 1; j < strs.length; j++) {

      if (strs[j].substring(0, i) !== str) {
        has_common = false;
        break;
      }

    }
    
    // 若本次遍历不存在公共字符,则返回上一次遍历结果
    if (!has_common) return str.substring(0, i-1);
  }

  // 若全部通过遍历,则最长公共前缀为字符串自身
  return first;
};

方法二

原理如图:


1674837-beb1e1c62d339a13.png
image.png

简单地说,查找一组字符串的最长公共前缀,等于任意两个字符串的公共前缀,公式如下:


1674837-addc39aa459e133b.png
image.png
var longestCommonPrefix = function(strs) {
  let prefix = strs[0];

  if (prefix == undefined || prefix == '') return '';

  for (let i = 1; i < strs.length; i++) {
    while (strs[i].indexOf(prefix) !== 0) {
      prefix = prefix.substr(0, prefix.length - 1);

      if (prefix == '') return '';
    }
  }

  return prefix;
};

时间复杂度为: O(S),S为所有字符串中字符数量的总和。
空间复杂度为:O(1)

猜你喜欢

转载自blog.csdn.net/weixin_33868027/article/details/86892413