题目重现:day005
这道题真是有点emmm.....每次提交都能发现自己的漏洞,查漏补缺做出来了。但是比较冗长,把代码和感想记录如下:
class Solution:
def longestCommonPrefix(self, strs):
count = 0
if len(strs) > 1:
if len(min(strs, key=len)) == 0:
flag = False
else:
flag = True
while flag:
for i in range(1, len(min(strs, key=len))+1): #检测每一个字符
for j in range(len(strs)-1):
if strs[j][:i] == strs[j+1][:i]:
if j+1 == len(strs)-1: #运行到最后一个字符串
count += 1
flag = False
break
else:
flag = False
break
if count > 0:
return strs[0][:count]
elif len(strs) == 1:
return strs[0]
else:
return ''
主要的输入区别有strs=[],strs=[' ',' '],strs=['a']这些特殊类型,每碰到一种新情况我就改进一点。看了评论区大神的做法,流下了没有技术的泪水:
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if not strs: return ""
str0 = min(strs)
str1 = max(strs)
for i in range(len(str0)):
if str0[i] != str1[i]:
return str0[:i]
return str0
这里主要是利用了min和max函数,其实我一开始在第一个for循环那里也有点这个思想,但是我找的是最短的那个字符串。没有想到python的min和max函数可以直接根据字母大小排序.....简直就是魔法。在python中 None, False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()都相当于False
之后我改进了成自己觉得比较好理解的版本:
class Solution:
def longestCommonPrefix(self, strs):
count = 0
if len(strs)==0 or '' in strs:
return ""
a = min(strs)
b = max(strs)
for i in range(1,len(a)+1):
if a[:i] == b[:i]:
count += 1
return a[:count]
用一个count计数到哪个相等的位置。这里不太熟练的还是从0开始的技术方式,包括range,但是在a[:i]上的索引是从1开始计数的。