每天一个算法,提升能力

201 阅读1分钟

前言:为什么加强算法?

编程语言千千万,更新迭代更是日新月异,剥除编程语言自身的语言,提炼出来的就是数据结构 + 算法只有把精力放在最基础,最底层的知识上,苦练内功才能以不变应万变,才能提升自己的硬实力。

GitHub

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

示例1
输入: ["flower","flow","flight"]
输出: "fl"
示例2
输入: ["dog","racecar","car"]
输出: ""

javaScript解题思路

GitHub GitHub GitHub 从前往后一次比较字符串,获取公共前缀
时间复杂度:O(s)是所有字符串中字符数量的总和
空间复杂度:O(1)

var longestCommonPrefix = function(strs) {
    if (strs === null || strs.length === 0) return "";
    let prevs = strs[0]
    for(let i = 1; i < strs.length; i++) {
        let j = 0
        for(; j < prevs.length && j < strs[i].length; j++) {
            if(prevs.charAt(j) !== strs[i].charAt(j)) break
        }
        prevs = prevs.substring(0, j)
        if(prevs === "") return ""
    }
    return prevs
};

typeScript解题思路

1.最长前缀相同,所以要遍历数组中元素最短的一个:x。
2.拿长度最短的元素x判断其它元素是否以它开始,如果都,则返回x,程序结束。
3.如果有一个不是以它开始,则此次判断结束,然后取x的前x.length-1长度,重复2步骤。
3.如果有一个不是以它开始,则此次判断结束,然后取x的前x.length-2长度,重复2步骤。
.......
4.如果取的长度为0,证明没有共同前缀,返回空字符串,程序结束

function longestCommonPrefix(strs: string[]): string {
    if (!strs.length) {
        return "";
    }
    let min = strs[0];
    strs.forEach(item => {
        if (item.length < min.length) {
            min = item;
        }
    });
    const minArr = min.split("");
    for (let i = minArr.length; i > 0; i--) {
        let pre = minArr.slice(0, i).join("");
        let has = 0;
        for (let j = 0; j < strs.length; j++) {
            if (strs[j].startsWith(pre)) {
                has++;
            } else {
                break;
            }
        }
        if (has === strs.length) {
            return pre;
        }
    }
    return "";
};