时间:2020-6-19
题目地址:https://leetcode-cn.com/problems/longest-common-prefix/
题目难度:Easy
题目描述:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
思路1:遍历-纵向扫描
还有横向扫描从前往后来两两找最长公共前缀
代码段1:通过
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if(len(strs) <= 1): return "".join(strs)
result = ""
max_number = min(len(i) for i in strs)
for i in range(max_number):
for j in range(len(strs)):
if strs[0][i] != strs[j][i]:
return "".join(result)
result += strs[0][i]
return "".join(result)
总结:
- 一开始以为双层for循环又要超时呢
- 哈哈哈 简直了 暴力法+面向测试编程,流下了没有技术含量的泪
- 这个看起来比较优雅,但是时间和空间也不比我的好
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if not strs: return ""
for i in range(len(strs[0])):
c = strs[0][i]
if any(i == len(strs[j]) or strs[j][i] != c for j in range(1, len(strs))):
return strs[0][:i]
return strs[0]
思路2:使用python的特性,取每一个单词的同一位置的字符,判断是否相同
代码段2:通过
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
res = ""
for temp in zip(*strs):
a = set(temp)
if len(a) == 1:
res += temp[0]
else:
break
return res
总结:
- *号和zip用的太骚了
- 在变量前加单星号表示将元组(列表、集合)拆分为单个元素。双星号同上,区别是目标为字典,字典前加单星号的话可以得到“键”。
思路3:这个排序和枚举用的太6了
代码段3:通过
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if not strs: return ""
s1 = min(strs)
s2 = max(strs)
for i, x in enumerate(s1):
if x != s2[i]:
return s2[:i]
return s1
总结:
- max()和min(),在Python里字符串是可以比较的,按照ascII值排
其他方法:分治、二分查找