【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
一、题目
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a - z 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-common-prefix
二、解答
这道题是一道简单类型的题,不过做的我很心累。除了嵌套for循环我在没想到更好的方法。嵌套for循环想起里很简单,但是写起代码来还是有点困难的,我也是一个python入门不久的新人,python的语言特性不是很熟悉,走了许多弯路。
解题思路:
1.先找到s中的单词得最短长度,因为我们的循环次数绝对比最短的要短。不可能返回一个比最短单词还要长的字符串。
2.外层循环为i次,i是最短长度。内存循环为第一个是循环是把所有单词得第i个字母入队。第二个for循环是判断入队的字母是否完全一致。
如果一致,ans += 1,意味着公共前缀➕1
如果不一致,说明到现在已经发现了不相同的字母(从左往右),所以直接返回,没有必要继续比较,浪费时间。
以下是代码:
class Solution:
def longestCommonPrefix(self, s):
if len(s) == 0:
return ""
min_len = len(s[0])
queue = []
ans = 0
# 找到最短的单词长度
for index, elem in enumerate(s):
if min_len > len(elem):
min_len = len(elem)
# 外层for循环循环每个单词字母
for i in range(min_len):
# 取每个字母的第i个字符并且入队
for index, elem in enumerate(s):
queue.append(elem[i])
# 判断队列中的字母是否相同
for i in range(len(queue)):
flag = False
if queue[i] != queue[0]:
return s[0][0:ans]
else:
ans += 1
queue.clear()
return s[0][0:ans]
运行结果:
以下是一个执行时间为32ms的范例(leetcode没有注明作者):
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
s = ''
j = 0
try:
while True:
if strs[0][j] == '':
return s
a = strs[0][j]
flag = 0
for i in strs:
if len(i) <= j:
flag = 1
elif i[j] != a:
flag = 1
break
if flag == 0:
s += a
else:
break
j += 1
except:
return s
return s
emm...看不懂,还是太菜!
最后附上参考数据: