算法记录——14最长公共前缀

本文探讨了如何解决LeetCode上的14号问题——找到字符串数组的最长公共前缀。博主分享了三种解题方法,包括逐一比对、仅比对最长和最短的字符串,以及使用分治策略。每种方法都有详细的代码实现,并分析了它们的优缺点。通过实例展示了如何在JavaScript中实现这些方法,并提供了测试用例和运行结果。
摘要由CSDN通过智能技术生成

这题做的我有点那个 可能是跟今日心情有点关系~~
题目

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

如果不存在公共前缀,返回空字符串 ""。
输入:strs = ["flower","flow","flight"]
输出:"fl"
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成

能做来即可的解法:
我都不知道这题考啥
感觉就是比对
我的思路是先找出最短的然后根据最短的去比对数组里的值的每一项
感觉我写的贼麻烦

/*
 * @lc app=leetcode.cn id=14 lang=javascript
 *
 * [14] 最长公共前缀
 */

// @lc code=start
/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function (strs) {
  let len = strs.length;
  if (len <= 1) return strs.toString();
  let temp = strs[0];
  let res = "";
  for (let i = 0; i < len; i++) {
    if (temp.length > strs[i].length) {
      temp = strs[i];
    }
  }
  for (let j = 0; j < temp.length; j++) {
    let flag = true;
    for (let item = 0; item < len; item++) {
      if (strs[item].includes(temp[j]) && strs[item][j] == temp[j]) {
        flag = true;
      } else {
        flag = false;
        break;
      }
    }
    if (flag) {
      res += temp[j];
    } else {
      break;
    }
  }
  return res;
};
// @lc code=end

123/123 cases passed (72 ms)
Your runtime beats 83.31 % of javascript submissions
Your memory usage beats 36.09 % of javascript submissions (39.7 MB)

好的解题答案:
1.逐一比对,找出公共的

/*
 * @lc app=leetcode.cn id=14 lang=javascript
 *
 * [14] 最长公共前缀
 */

// @lc code=start
/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function (strs) {
  if (strs.length == 0) return "";
  let ans = strs[0];
  for (let i = 1; i < strs.length; i++) {
    let j = 0;
    for (; j < ans.length && j < strs[i].length; j++) {
      if (ans.charAt(j) !== strs[i].charAt(j)) break;
    }
    ans = ans.substring(0, j);
    if (ans === "") return "";
  }
  return ans;
};
// @lc code=end

2.仅比对最长和最短的字符串

/*
 * @lc app=leetcode.cn id=14 lang=javascript
 *
 * [14] 最长公共前缀
 */

// @lc code=start
/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function (strs) {
  //最大最小长度比对
  if (strs.length <= 1) return strs.toString();
  let min = 0,
    max = 0;
  for (let i = 1; i < strs.length; i++) {
    if (strs[min] > strs[i]) {
      min = i;
    }
    if (strs[max] < strs[i]) {
      max = i;
    }
  }
  for (let index = 0; index < strs[min].length; index++) {
    if (strs[min].charAt(index) != strs[max].charAt(index)) {
      return strs[min].substring(0, index);
    }
  }
  return strs[min];
};
// @lc code=end

3、分治策略

/*
 * @lc app=leetcode.cn id=14 lang=javascript
 *
 * [14] 最长公共前缀
 */

// @lc code=start
/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function (strs) {
  if (strs === null || strs.length === 0) return "";
  return lCPrefixRec(strs);
};

// 若分裂后的两个数组长度不为 1,则继续分裂
// 直到分裂后的数组长度都为 1,
// 然后比较获取最长公共前缀
function lCPrefixRec(arr) {
  let length = arr.length;
  if (length === 1) {
    return arr[0];
  }
  let mid = Math.floor(length / 2),
    left = arr.slice(0, mid),
    right = arr.slice(mid, length);
  console.log("left", left, "right", right);
  return lCPrefixTwo(lCPrefixRec(left), lCPrefixRec(right));
}

// 求 str1 与 str2 的最长公共前缀
function lCPrefixTwo(str1, str2) {
  console.log("str1", str1, "str2", str2);
  let j = 0;
  for (; j < str1.length && j < str2.length; j++) {
    if (str1.charAt(j) !== str2.charAt(j)) {
      break;
    }
    }
  return str1.substring(0, j);
}
// @lc code=end

感觉第三种更好理解一点,平时也总是用,就是把问题进行拆分;大问题变成小问题;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值