码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-03-03 16:26:02      阅读:64      评论:0      收藏:0      [点我收藏+]

标签:max   turn   不同   空字符串   思路   sha   假设   最长公共子序列   最长公共前缀   

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

技术图片                      技术图片

 

 

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

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

(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)

标签:max   turn   不同   空字符串   思路   sha   假设   最长公共子序列   最长公共前缀   

原文地址:https://www.cnblogs.com/shawn-young/p/12402408.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!