题目:
思路:
我开始是想把strs中的每个元素转化为集合中的元素,然后取交集,但是发现对于有相同元素但顺序不同的字符串无法解决(ps同时发现交集是左右左右这样取的)。
然后又是暴力破题,先取出两个字符串,找到公共前缀,用这个公共前缀去和剩余字符串比较。
代码:
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if len(strs)==1 or strs[0]=="": #如果只有一个字符串,或者第一个字符串为""
return strs[0]
left = 0
right = 1
temp_list = []
temp_list1 = []
if strs[left] =='' or strs[right] =='':
return ''
length_r = len(strs[right])
length_l = len(strs[left])
length = min(length_l,length_r)
i = 0
while i < length and strs[left][i] == strs[right][i]:
temp_list.append(strs[left][i]) #找到第一个字符串和第二个字符串的公共前缀
i +=1
for element in strs[1:]: #从第二个元素开始遍历
if element =='': #如果有元素为“”,直接return
return ''
length = min(len(temp_list),len(element)) #计算公共前缀长还是新的字符串长
k = 0
while k<length :
if temp_list[k] == element[k]: #如果字符串元素相同,k+1
k +=1
else:
temp_list1 = temp_list[0:k] #否则就保留相同的字符串元素并清除旧的
temp_list = temp_list1[::]
temp_list1.clear()
break
else: #针对公共前缀比elemen长的情况 ["ac","ac","a","a"]这种
temp_list1 = temp_list[0:k]
temp_list = temp_list1[::]
temp_list1.clear()
return ''.join(''.join(temp_list))
大神代码:
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
s0 = strs[0]
for j, c in enumerate(s0): #枚举类型,j是次序(0,len-1),c为对应元素
for s in strs:
if j == len(s) or s[j] != c: #每一行的第j个元素是否相同,同时找到最短的哪一行
return s0[:j]
return s0
作者:灵茶山艾府
链接:https://leetcode.cn/problems/longest-common-prefix/solutions/2801713/jian-dan-ti-jian-dan-zuo-pythonjavaccgoj-478q/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
大神的思路是真的简洁啊,感觉自己一直是在暴力破题,根据测试用例反向弥补漏洞,很难一开始就考虑的很全面。一开始我也想到这种矩阵第一列这样去对比,但是就是没有好的实现方式。感觉要换点角度刷题了。