🍧 leetcode刷题之【最长公共前缀】

317 阅读1分钟

这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战


写在前面:

  • 个人前端网站:zhangqiang.hk.cn
  • 欢迎加入博主的前端学习qq交流群::706947563专注前端开发,共同学习进步

1 题目

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

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

示例 1:

输入:strs = ["flower","flow","flight"]
输出:"fl"

示例 2:

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

提示:

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

2 个人解析

2.1 思路

首先看这个思路时,希望是读完题目5遍以后才来看的(所谓 题读5遍,其义自见)。ok,鄙人采取的思路是,拿第一个字符串和他后面的每个字符串依次比较,当与他比较的那个字符串的某一位字符与之对应的某一位字符不相等了,那结束,记录当前前公共前缀,再比较下一个,以此类推。

上面这个思路,还有几个细节:

  1. 如果比较的字符串比当前记录下来的公共前缀要长,那么就会记录出错,这是特例,得单独处理;
  2. 如果是空字符串,直接返回“”;

2.2 代码

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
    let publicLen = strs[0];
    for(let i=0;i<strs.length;i++){
        if(strs[i]===""){
            return "";
        }
        for(let j=0;j<strs[i].length;j++){
            if(publicLen[j]!==strs[i][j]){
                publicLen=strs[i].slice(0,j);
                break;
            }
            // 特例
            if(j+1===strs[i].length ){
                publicLen=strs[i];
            }
        }
    }
​
    return publicLen;
};

3 大佬的解析

巧用sort排序方法,当数组是字符串的时候,他排序是按照那个码来排的,比如说数组["reflower","abc","a","b","z"],他排序的结果是[ 'a', 'abc', 'b', 'reflower', 'z' ],是按照第一个字符的大小来排,当第一个相同的的时候,依次往后比较,直到比较出大小。知道这个就好办了。直接排序好,比较第一个和最后一个,返回相同的串即可。

var longestCommonPrefix = function (strs) {
    if(strs.length <= 1)return strs[0];
    strs.sort();
    let len = strs[0].length;
    let i;
    for (i = 0; i < len; i++) {
        if(strs[strs.length - 1].charAt(i) !== strs[0].charAt(i))break;
    }
    if(i < 1)return "";
    return strs[0].substring(0, i);
};