14. 最长公共前缀

268 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第31天,点击查看活动详情

每日刷题 2022.06.29

题目

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

示例

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

提示

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

解题思路

  • 获取数组中的最大值及最小值字符串,最小字符串与最大字符串的最长公共前缀也为其他字符串的公共前缀,即为字符串数组的最长公共前缀
  • 例如:abcabcdabac ,最小 ab 与最大 ac 的最长公共前缀一定也是 abcabcd 的公共前缀

具体方法

  • 横向扫描:初始化最长公共前缀 result 的值为数组第一个字符串遍历后面的字符串,依次将其与 result 进行比较,两两找出公共前缀,遇到字符不同结束遍历即可。
  • 通过 k 记录当前遍历到的相同下标,然后直接重新赋值即可 result = result.slice(0, k)
  • 时间复杂度:O(mn),其中 m 是字符串数组中的字符串的平均长度,n 是字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次。
  • 边界条件:当字符串数组长度为 0 时则公共前缀为空,直接返回 时间上的优化,可以通过 nowLength = result.length 存储当前记录的公共前缀长度,后面 while 循环时就可以用这个存储的变量作为边界条件约束k

AC代码

var longestCommonPrefix = function(strs) {
  // 如果传入的数组为空
    if (strs.length == 0) {
        return '';
    }
    let ans = '';
    // 取出数组中的第一个字符串
    let [a,...b] = strs;
    // console.log(a,b);
    for (let i = 0; i < a.length; i++) {
        // 定义一个标志
        // console.log('循环',a[i]);
        let flag = b.every((item) => { 
        //   console.log(item[i],a[i]);
          return item[i] == a[i]; 
        });
        // 判断标记真,给结果加
        if (flag){
            ans += a[i];
            // console.log('a', a[i]);
        } 
        else break;
    }
    return ans;
};