最长公共前缀(第4题)

138 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

菜鸟还要从第4题继续

一、题目描述:

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

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

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/lo… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

纵向扫描,暴力求解,一个一个位数去比。用charAt,substring方法处理字符串

横向扫描 时间复杂度:O(mn) n 表示字符串数组中所有字符串的平均长度,m 表示字符串数组的大小空间复杂度:O(1)

参考官方题解,针对横向扫描可以用分治的方法处理,时间复杂度:O(mn)

三、AC 代码:

1、纵向扫描

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
    if(strs.length==0) return ''
    let m = strs.length
    let n = strs[0].length
    for(let i=0;i<n;i++){
        nowChar = strs[0].charAt(i)
        for(let j=1;j<m;j++){
                if (strs[j].length == i || strs[j].charAt(i) != nowChar) {
                return strs[0].substring(0, i);
            }
        }        
    }
    return strs[0] //当strs[0]本身是公共前缀时(最短)
};

2、横向扫描

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
    if(strs.length==0) return ''
    let m = strs.length
    let prefix = strs[0]
    for(let i=1;i<m;i++){
        if(prefix=='')break
        prefix=contrastPrefix(prefix,strs[i])
    }        
    return prefix
};

var contrastPrefix = function( prefix, str ){
    let n = Math.min(prefix.length,str.length)
    for(let j=0;j<n;j++){
       if (str.charAt(j) != prefix.charAt(j)) {
            return prefix.substring(0, j);
        }
    }
    return prefix.substring(0,n)//两个相等时,或者str为''时
}

3、分治

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
    if(strs.length==0||strs==null) return ''
    return leftRight(strs,0,strs.length-1)
};

var leftRight = function(strs, left , right ){
        if (left == right) {
            return strs[left];
        } else {
            let mid =  Math.floor((right - left) / 2 )+ left;
            let lcpLeft = leftRight(strs, left, mid);
            let lcpRight = leftRight(strs, mid + 1, right);
            return contrastPrefix(lcpLeft, lcpRight);
        }
}

var contrastPrefix = function( prefix, str ){
    let n = Math.min(prefix.length,str.length)
    for(let j=0;j<n;j++){
       if (str.charAt(j) != prefix.charAt(j)) {
            return prefix.substring(0, j);
        }
    }   
    return prefix.substring(0,n)
}