8-最长公共前缀

题目

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

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

示例 1:

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

示例 2:

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

说明:

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

解答

竖直扫描

一个个元素拿出来,一起比较他们的某个指针对应的字符。

累加双循环

外层设置一个index指针,一个个数组元素来比较index上的字符。

  • 如果每个数组元素的index字符都一样,那么就加入到result当中;

  • 如果有一个不一样,那么就直接return结果;

  • 或者index指向超出了数组元素的范围,也跳出循环return结果

Runtime: 60 ms, faster than 74.35% of JavaScript online submissions forLongest Common Prefix.

Memory Usage: 34.9 MB, less than 68.15% of JavaScript online submissions for Longest Common Prefix.

判断undefined不能直接用相等来判断,而要用typeof

累减双循环

作者:guanpengchn

链接:https://leetcode-cn.com/problems/two-sum/solution/hua-jie-suan-fa-14-zui-chang-gong-gong-qian-zhui-b/

思路是,先随便初始化一个str,然后一个个值来比对。遇到不一样就跳出来,只保留一样的部分

Runtime: 60 ms, faster than 74.35% of JavaScript online submissions forLongest Common Prefix.

Memory Usage: 34.8 MB, less than 73.04% of JavaScript online submissions for Longest Common Prefix.

累加和累减差不多

水平扫描

数组元素从前往后两两拿出来比较,相同的地方留下。比较的结果进入下一轮的两两比较。

也就是说,如果有个函数$LCP(S_1,S_2) $,输入两个字符串,输出他们共同的前缀。那么不断递归这个函数就行了。$LCP(LCP(S_1, S_2), S_3)$一直递归就完事了。

减法:

Runtime: 52 ms, faster than 95.14% of JavaScript online submissions forLongest Common Prefix.

Memory Usage: 35 MB, less than 61.97% of JavaScript online submissions for Longest Common Prefix.

加法:

Runtime: 52 ms, faster than 95.14% of JavaScript online submissions forLongest Common Prefix.

Memory Usage: 36.7 MB, less than 8.39% of JavaScript online submissions for Longest Common Prefix.

两者好像差不多。。

两分法

strs数组,不断从中间切两半。切到两个元素一组,再用$LCP(S_1,S_2) $来比较。

image-20190701153804080

感觉这和一个个找没啥本质区别,反而逻辑更复杂了。。。

还有个两分查找法

image-20190701161103988

没能复现出来。。

字典树也复现不出来。。

Last updated

Was this helpful?