LeetCode《初级算法》字符串之最长公共前缀 -- JavaScript

114 阅读1分钟

题目

题目链接:leetcode-cn.com/leetbook/re…

image.png

题解

1、多指针比较字符串


题目是求字符串数组中最长的公共序列,我们以往经常使用双指针做比较两个字符串的题目,而这个题目是比较多个字符串,我们一样可以用多指针的方式来比较;
/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {

    // 边界情况:当字符串数组中的字符串都为空时
    if(strs[0] === ''){
        return '';
    }

    const strsLen = strs.length;
    let repeatStringArr = [];
    let flag = false;
    let j = 0;
    // 要注意边界情况,即 字符串数组中的所有字符串都一样 和 字符串数组为空 的情况
    while(!flag) {
        // 一轮比较所有字符串

        let i = 0
        for(;i < strsLen - 1;i++) {
            
            if(strs[i][j] !== strs[i+1][j]) {
                flag = true;
                break;
            } 
        }
        if(i === strsLen - 1) {
            repeatStringArr.push(strs[0][j]);
        }
        if(flag) {
            break;
        }
        j++;
        // 边界情况:当字符串数组中的所有字符串都相同时退出循环
        if( strs[0].length <= j ){
            break;
        }
    }


    return repeatStringArr.join('');

};

2、从第一个开始字符串两两比较


上面的方法是每一次比较都比较字符串数组中的所有字符串;而这种方法是每次先比较完字符串数组中的其中两个字符串,获取公共字符串,然后将公共字符串和其它未比较的字符串比较;
/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {

    if(strs[0] === ''){
        return '';
    }
    
    const strsLen = strs.length;
    let repeatString = strs[0];

    // 将重复的前缀逐一和字符串数组中的每一个字符串比较
    for(let i = 1;i < strsLen;i++) {

        if(repeatString === '') {
            return '';
        }
        // 比较 repeatString 和 strs[i]
        const rsLen = repeatString.length,
            strLen = strs[i].length;
        let m = 0,
            n = 0;
        while(m <= rsLen && n <= strLen) {

            if(repeatString[m++] !== strs[i][n++]) {
                break;
            }
        }
        repeatString = repeatString.slice(0,m-1);

    }

    return repeatString;

};

大家如果有更好的思路和解法,欢迎大家一起来讨论啊~

这是使用 JavaScript 对 LeetCode《初级算法》的每道题的总结和实现的其中一篇,汇总篇在这里:

juejin.cn/post/700669…