leetcode14.最长公共前缀(字符串数组)

466 阅读3分钟

「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」。

每日刷题第32天 2021.1.28

14. 最长公共前缀

题目

  • 编写一个函数来查找字符串数组中的最长公共前缀。
  • 如果不存在公共前缀,返回空字符串 ""

示例

  • 示例1
输入: strs = ["flower","flow","flight"]
输出: "fl"
  • 示例2
输入: strs = ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。

提示

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 仅由小写英文字母组成

解法

解法1(自己的想法)

  • 首先‼️:判断临界条件,输入的数组长度为1时,直接返回:数组中存储的字符串即可。
  • 第一步:找出所给的字符串中,最短的字符串,将其作为“比较对象”。(例如示例1中,'flow'字符串即为“比较对象”)
  • 第二步:将其他的字符串 与 最短字符串的每个截取部分进行比较。
    • 如果有不同就跳出,直接输出:最长的公共前缀(相同时,记录相同的子字符串)
    • 如果一直遍历到最后都没有找到不同,那么就输出 “比较对象”(最短的字符串)
  • 模拟本题(如下图所示) image.png image.png image.png

后来思考🤔

  • 发现使用这种做法,其实不需要使用slice()方法也可以实现,就是单独的将“比较对象”的每一项 与 其他字符串的每一项进行比较,遇到不同直接输出。
  • 拓展:
    • slice(start, end)方法,截取字符串数组的[start, end)区间中的值。
    • substr(start, len)方法,截取字符串数组的开始位置 到 长度为len的值。

代码展示

/**
* @param {string[]} strs
* @return {string}
*/

var longestCommonPrefix = function(strs) {
  // 有一个不相同就直接返回
  if(strs.length == 1) return strs[0];
  // 取最短的字符串
  let lenRow = Infinity;
  let index = 0;
  for(let i = 0; i < strs.length; i++) {
    if (strs[i].length < lenRow){
      lenRow = Math.min(lenRow, strs[i].length);
      index = i;
    }
  }
  // console.log('lenRow',lenRow,'index',index);
  // 截取 当前需要比较的字符串 所有的字符串
  let longest = "";
  for(let i = 0; i < strs[index].length; i++){
    let a = strs[index].slice(0,i + 1);
    for (let j = 0; j < strs.length; j++) {
      if (j == index) continue;
      // console.log('截取',strs[index].slice(0,i + 1));
      let b = strs[j].slice(0, i + 1);
      // console.log('a',a,'b',b);
      if(!(a == b)) return longest;
    }
    longest = a;
  }
  return strs[index];
};

解法2(查看题解后的思路优化)

  • 取字符串数组的第一个字符串,作为“比较对象”
  • 与下一个字符串比较的时候,找到公共的前缀(每次通过字符串的substr()方法来实现截取)。
  • 以此循环往下,找到所有字符串的公共前缀即:最长的公共前缀
    • 如果还没有找完,公共前缀为空,就返回空字符串
    • 如果找到最后都没有为空,那么返回最长的公共前缀即可
  • 代码展示
/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
    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[j] != strs[i][j])
                break;
        }
        ans = ans.substr(0, j);
        if(ans === "")
            return ans;
    }
    return ans;
};