本博客的作者与csdn里 Tank_in_the_street的作者是同一作者,转载文章需写明出处。本文章的代码存放在GitHub上,点击地址即可查看源码:最长公共前缀
下面刷题刷到第十四题,最长公共前缀。先来看看题目:
这道题里我们的函数会接收到一个字符串类型的数组,然后在这些字符串中找到公共的最长前缀。乍一看直接双重for循环撸就完事了。不过嘛除了双重for循环,我们可以用到双指针来求解。
我的解法思路是这样的,首先判断第一个元素是否是个空字符,如果是的话就直接返回空字符,不是的话用一个变量来储存第一个元素的一个字符,然后逐个元素遍历当前下标的字符是否一样,一样就拼接到一个变量上,不一样则返回拼接变量。变量到最后一个元素的时候我们让字符串指针归零,字符指针加一继续进行下一轮遍历,直到找出最长公共前缀为止,代码如下:
不过做为这道题后我想其实可以利用二分查找来解题,如果用到二分查找的话时间复杂度就会变成O(logn),比我的O(m*n)的时间复杂度更少。二分查找的解题思路是这样的,随机用一个元素的的中间值和下标作比对值,这里我们用第一个元素的中间值,然后递归循环比较当前下标里每个元素的字符是否相等,如果是则对右边继续递归,不是则对左边继续递归,当起始下标大于结束下标的时候递归结束返回一个字符串,方法如下:
本题有个地方要注意的是空字符也是一个字符串,要判断当前数组中有无空字符串,有的话则直接返回。说实话,好像中文版的运行时间好像普遍比国际版的运行时间慢,不知道什么原因。
上一题: leetCode第十二题和十三题,整数与罗马数的相互转换,JavaScript实现