继续解Leetcode,最长公共前缀

245 阅读3分钟

这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战

一、写在前面

LeetCode 第一题两数之和传输门:听说你还在写双层for循环解两数之和?

LeetCode 第二题两数之和传输门:两个排序数组的中位数,“最”有技术含量的解法!

LeetCode 第三题最长回文子串传输门:马拉车算法解最长回文子串!Manacher

LeetCode 第四题字符串转整数 (atoi):“愚公移山”的方法解atoi,自以为巧妙!

今天给大家分享的是LeetCode 数组与字符串 第五题:最长公共前缀,为面试而生,期待你的加入。

二、今日题目

编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。

示例:

示例 1:

输入: ["flower","flow","flight"]
输出: "fl"

示例 2:

输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。

说明: 所有输入只包含小写字母 a-z 。

三、 分析

这个题目,第一眼一看,无论是题干还是示例都是---怎么这么简单?错觉,看着的确简单,但是还是有很多难点,比如:strs的长度是不定的;strs里的字符串长度也是不定的,总的来说还是比较简单,我看到题目的第一个想法就是暴力查找,比较,这个方法不是太好,优化了一下思想,主体流程如下:

我的思想

四、解题

  • 我的方法: 根据上面思想直接敲~ 双重for循环时间复杂度:应该不到O(n^2)
'''
题目:
最长公共前缀
	编写一个函数来查找字符串数组中的最长公共前缀。
	如果不存在公共前缀,返回空字符串 ""。
	Longest Common Prefix
'''


class Solution:
	def longestCommonPrefix(self, strs):
		"""
		:type strs: List[str]
		:rtype: str
		"""
		len0 = len(strs)
		if len0 == 0:
			return ''
		list_len = []
		# 找出最短的字符串长度
		for i in range(len0):
			list_len.append(len(strs[i]))
		list_len.sort()
		# 取出最短的子串
		# 我这里是直接取第一个子串的前min_len
		com_str = strs[0][0:list_len[0]]
		b0 = com_str
		for s in strs:
			for i in range(list_len[0]):
				if s[i] != com_str[i]:
					# 判断到有不等的地方
					a0 = s[0:i]
					if len(b0) >= len(a0):  # 上一个最长公共前缀是否比现在长
						b0 = a0
		return b0

提交结果

提交结果

测试数据:118组
运行时间:48ms
击败人百分比:92.21%

  • 大牛方法: 一层for循环时间复杂度:O(n)
# 大牛的方法,9行代码
class Solution:
	def longestCommonPrefix(self, strs):
		"""
		:type strs: List[str]
		:rtype: str
		"""
		res = ""
		if len(strs) == 0:
			return ""
		# zip()函数用于将可迭代对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表
		for each in zip(*strs):
			# 利用集合创建一个无序不重复元素集
			if len(set(each)) == 1:
				res += each[0]
			else:
				return res
		return res
  • 提交结果

提交结果

测试数据:118组
运行时间:28ms
击败人百分比:95.84%

五、结语

今天有个读者问我,我为什么这么优秀,我回答的是“我其实和大家差不多”,真正优秀的是我的坚持,学习就是这样,肯坚持、肯埋头苦干,终有所获我给那个读者了两个建议,这里也分享给大家:

  • 1.自己得坚持学习,找准方向,学python就不要想着java;
  • 2.知识付费,花点钱购买对自己有用的课程(技术、情感、生活等等方面)

希望大家会因为关注了我,而学到一些东西,技术或者生活上,多交流,才能进步。 坚持 and 努力 : 终有所获。