leetcode学习笔记:《数组和字符串》——最长公共前缀[亲测有效]

编程文档 (67) 2023-08-05 19:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说leetcode学习笔记:《数组和字符串》——最长公共前缀[亲测有效],希望能够帮助你!!!。

leetcode学习笔记:《数组和字符串》——最长公共前缀[亲测有效]_https://bianchenghao6.com/blog_编程文档_第1张

题目地址

https://leetcode.cn/problems/longest-common-prefix

解题思路和代码

重点:最长公共前缀

所以思路很直白,通过遍历,确定最长的前缀。

function longestCommonPrefix(strs: string[]): string {
  let prefix = ''

  // 比较关键的一步,将字符串数组按照长度由短到长排列,减少比较时间
  strs.sort((a, b) => a.length - b.length)

  // 按照最短字符串的长度开始遍历比较
  for (let i = 0, l = strs[0].length; i < l; i++) {
    let flag = true
    for (let j = 1, l2 = strs.length; j < l2; j++) {
      // 不匹配的情况下快速返回
      if (strs[j][i] !== strs[j - 1][i]) {
        flag = false
        break;
      }
    }
    // 匹配的话要更新最长前缀的值
    if (flag) {
      prefix += strs[0][i]
    } else {
      // 不匹配快速跳出
      break;
    }
  }

  return prefix
}

提交结果:

leetcode学习笔记:《数组和字符串》——最长公共前缀[亲测有效]_https://bianchenghao6.com/blog_编程文档_第2张

这种方式对内存的使用不太友好,可以看下下面这种内存使用更优的方案:

function longestCommonPrefix(strs: string[]): string {
    let prefix = strs[0]; // 假设第一个单词是公共前缀
    for (let i = 1; i < strs.length; i++) {
        while (!strs[i].startsWith(prefix)) {
            prefix = prefix.slice(0, -1); // 从当前前缀的末尾去掉一个字符
        }
    }
    return prefix; // 返回最长的公共前缀
};

1. `let prefix = strs[0];`:假设第一个单词是公共前缀,将其作为初始前缀。

2. `for (let i = 1; i < strs.length; i++)`:遍历除第一个单词以外的所有单词。

3. `while (!strs[i].startsWith(prefix))`:如果当前单词不以当前前缀开头,则执行循环。即,只要当前前缀不是当前单词的前缀,就继续循环。

4. `prefix = prefix.slice(0, -1);`:从当前前缀的末尾去掉一个字符,缩短前缀的长度。

5. `return prefix;`:返回最长的公共前缀。

发表回复