Leetcode--最长公共前缀(14)

Posted 神的孩子都在跳舞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode--最长公共前缀(14)相关的知识,希望对你有一定的参考价值。

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

                      

 

 

 思路:注意题目是要找“前缀”,而不是找最长公共子序列!(开始为了寻找最长公共子序列把这题想得过于复杂(@_@;))

结合大佬们的高级思路,这题大概整理出四种解法。

(1)水平扫描法:假设第一个字符串就是最长子序列pre,遍历剩余的字符串,如果存在一个字符串不包含此子序列,则去掉pre中的最后一次字符。直到所有的字符串中都包含此子序列时,则返回最终的pre。注意:这里用到了函数find(),该函数的用法:如果办函所给的子字符串则返回开始的索引值,否则返回-1.

 

 1 class Solution:
 2     def longestCommonPrefix(self, strs: List[str]) -> str:
 3         if strs == []:
 4             return \'\'
 5         pre = strs[0]
 6         for i in range(1,len(strs)):
 7             if (strs[i].find(pre) != 0):
 8                  pre = pre[:-1]
 9             #如果最后没有匹配到公共前缀
10             if pre == []:
11                 return \'\'
12             else:
13                 return pre

(2)另一种扫描法略有不同。对第一个字符串从头开始扫描,遍历其他字符串,如果其他字符串的相同位置所对应的字符也相同,则将该字符加入到最长公共子序列中。

 1 class Solution:
 2     def longestCommonPrefix(self, strs: List[str]) -> str:
 3         if strs == []:
 4             return \'\'
 5         else:
 6             pre = strs[0]
 7             for str in strs[1:]:
 8                 ans = \'\'
 9                 temp_len = len(str)
10                 i = 0
11                 while(i<len(pre) and i<temp_len and str[i] == pre[i]):
12                     ans += str[i]
13                     i += 1
14                 pre = ans 
15             return pre

 

剩下两种主要使用了python自带的函数

(3)max(str)以及min(str)。在python中字符串是可以依据ascii码的大小进行大小比较的,从首字符开始逐个字符进行比较,例如:abb>abac>aba。而对本题而言,最长公共前缀也是从第一个字符开始逐字符进行比较的。因此通过寻找最大字符串和最小字符串的最长公共前缀则可以找到strs的最长公共前缀。例如:如果最大字符串和最小字符串之间有公共前缀,ac<acb<acd,那么夹在ac和acd之间的acb也一定会包含公共前缀ac。(再次感叹,大佬们真是太强了(#°Д°))

 1 class Solution:
 2     def longestCommonPrefix(self, strs: List[str]) -> str:
 3         if strs == []:
 4             return \'\'
 5         str_max = max(strs)
 6         str_min = min(strs)
 7         for i in range(len(str_min)):
 8             if str_min[i] != str_max[i]:
 9                 return str_max[:i]
10         return str_min

(4)zip函数以及set函数。zip函数按列返回值,例如str = (["a","b","c"], ["1", "2", "3","4"]),list(zip(*str))=[(\'a\', \'1\'), (\'b\', \'2\'), (\'c\', \'3\')]。而set函数则使用集合的思想,创建一个无序不重复的元素的集合。

1 class Solution:
2     def longestCommonPrefix(self, strs: List[str]) -> str:
3         ans = \'\'
4         for str in zip(*strs):
5             if len(set(str)) != 1:
6                 ans += str[0]
7             else:
8                 break
9         return ans

关于zip函数和set函数的用法,以及python中*的含义,见https://www.cnblogs.com/shawn-young/p/12402889.html

 

以上是关于Leetcode--最长公共前缀(14)的主要内容,如果未能解决你的问题,请参考以下文章

leetcode14最长公共前缀

[leetcode 14] 最长公共前缀

leetCode第14题——最长公共前缀

LeetCode 14. 最长公共前缀

LeetCode:最长公共前缀14

Leetcode 14 最长公共前缀