标签: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
标签:max turn 不同 空字符串 思路 sha 假设 最长公共子序列 最长公共前缀
原文地址:https://www.cnblogs.com/shawn-young/p/12402408.html