今天做的是力扣简单题的最长公共前缀,依然一开始没有什么想法,思路也没有,好像这个题目与我无关一样,怎么想也想不出来如何做才能做出这样的题目。
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-common-prefix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
主要思路是这样的,有一个字符串数组,先对一个字符串进行提取作为匹配目标,用遍历前后两个字符串的方式匹配,每次成功匹配就加一位,匹配到无法相等的地方就结束,一直匹配,知道所有字符串匹配完成,时间复杂度是O(n)。
class solution:
def longeststr(strs):
if strs=='': #当字符串为空的时候,直接返回空字符串数组
return strs
ans = strs[0] #提取第一个作为锚定字符
for i in range(1,len(strs)): #选择后面的进行匹配
idx = 0
for char1,char2 in zip(ans,strs[i]):
if char1 != char2:
break #先对这个函数进行判定
idx+=1
ans = ans[0:idx]
if ans =="":
return ans
return ans
这是我半看到别人的思路写出来的, 确实不能算是原创,原创作者在解题里面排头的高分引用里面。
这里有什么知识呢,首先,我判断为空就直接返回这点,其实可以放在后面,比如
ans = strs[0]
if ans=='':
return ans
还有这里zip 的用法也是一个知识点,zip可以将对象当中的相对应的地方打包成一个个元组的数组列表,用的时候可以直接匹配。
想法2.
如何简单地将我想要的公共前缀提取出来。
if not s:
return ""
res = s[0]
i = 1
while i < len(s): #判断字符串数组比1大。
while s[i].find(res) != 0: #判断如果在这个字符串无法与之匹配
res = res[0:len(res)-1] #切片减少一位,继续进行
i += 1
return res
选找大小然后再进行枚举选择似乎也能节省不少时间。
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
这里先把最大长度和最小长度都标注出来,然后,枚举可以直接将下标和字符串标注出来,用以匹配。
这里的min和max都要调用筛选算法,理论上复杂度应该为O(n)