算法-最长公共前缀

80 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第22天,点击查看活动详情

题目来源:leetcode-cn.com/leetbook/re…

题目

编写一个函数来查找字符串数组中的最长公共前缀。(所有的输入只包含小写字母a-z)

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

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

思路分析

公共前缀,所有元素中都包含此元素,若从一个数组中勋章最长公共前缀,可以先将第一个元素设置为基准,,然后只需要根据基准元素和后面的元素进行比较,并且不断更新基准,直到基准元素和所有的元素都满足最长公共前缀的条件。

解题步骤

比如,base = flower,作为基准元素,然后一次进行拆解子串,其可能含有的子串有一下几种:“f”,“fl”,“flo”,“flow”,“flowe”,“flower”。 然后将所有的子串都拿到每个字符串中进行判断哪一个是所有字符串的前缀。就像枚举方式不断去判断直到结果是,如果不是就更新基准 base值。

在处理基准元素的处理,如果再数组中没有找到和基准元素相匹配的,那说明不存在最长公共元素。还需要注意临界条件:如果整个数组都是空的,那说明是没有最长公共前缀的。

代码实现

function func_exerise11(strs) {
    if (strs.length < 1) return "";
​
    let base = strs[0]
    for (let i = 0; i < strs.length; i++) {
        while (base != strs[i]) {
            if (base == '') return ''
            base = base.strSub(base.length - 1)
        }
    }
    return base;
}

总结

如果使用分治法解决,从中找到最小长度的字符串,然后将字符串分治解决。就是将问题分成两个字问题:将数组划分成两部分,分别求左边的最长公共前缀,求右边的最长公共前缀,然后再不断拆分,即左边再拆分2个,右边也再拆分,拆分到最小单位是只有一个单词,然后再不断合并求最长公共前缀。基本的解法就是二分+递归。