LeetCode-14-最长公共前缀
in LeetCode with 0 comment

LeetCode-14-最长公共前缀

in LeetCode with 0 comment

原题地址:最长公共前缀

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

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

示例 1:

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

示例 2:

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

说明:

所有输入只包含小写字母 a-z 。

暴力解法

因为公共前缀必须是数组中每一个字符串的前缀,所以我们可以将最长前缀初始化为第一个字符串,然后遍历数组来不断缩短这个最长前缀,就可以找到最后的结果:

/**
 * @param {string[]} strs
 * @return {string}
 */
const longestCommonPrefix1 = function(strs) {
    if (strs.length < 1) {
        return ''
    }

    /**
     * 寻找两个字符串的公共前缀
     * @param str1 字符串1
     * @param str2 字符串2
     * @returns {string|*} 公共前缀
     */
    const findCommonPrefix = (str1, str2) => {
        for (let i = 0; i < Math.min(str1.length, str2.length); i ++) {
            if (str1[i] !== str2[i]) {
                return i === 0 ? '' : str1.substr(0, i);
            }
        }
        return str1.length < str2.length ? str1 : str2;
    };

    // 初始化为第一个字符串
    let result = strs[0];
    // 通过遍历来缩小公共前缀的长度
    for (let i = 1; i < strs.length; i++) {
        result = findCommonPrefix(result, strs[i]);
        // 如果找到的前缀已经是空串了,结果一定是空串,可以直接返回
        if (result.length === 0) {
            return '';
        }
    }

    return result;
};

测试:

let start = new Date();
const test = longestCommonPrefix1;
console.log(test(['flower', 'flow', 'flight'])); // fl
console.log(test(['dog', 'racecar', 'car'])); // 返回空字符串
console.log(test([])); // 返回空字符串
console.log(new Date().getTime() - start.getTime()); // 3

时间复杂度: 时间复杂度为O(n),n是所有输入字符的数量,最差情况下需要把所有的输入字符都比较一次
空间复杂度: 只需要固定数量的额外空间,空间复杂度为O(1)