Description
Write a function to find the longest common prefix string amongst an array of strings.
If there is no common prefix, return an empty string “”.
Note:
All given inputs are in lowercase letters a-z.
Example
Example 1:
Input: [“flower”,“flow”,“flight”]
Output: “fl”
Example 2:
Input: [“dog”,“racecar”,“car”]
Output: “”
Explanation: There is no common prefix among the input strings.
Submissions
首先我的解题思路是将strs中第一个字符串作为模板prefix,依次循环模板长度次,对比剩余字符串的第i个字符与prefix的第i个字符是否相同,当出现不同或剩余字符串长度不够时结束,返回prefix第i位之前的字符串。
实现代码如下:
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if not strs:
return ""
prefix = strs[0]
for i in range(len(prefix)):
for s in strs[1:]:
if i<len(s) :
if s[i]!=prefix[i]:
return prefix[:i]
else:
return prefix[:i]
return prefix
Runtime: 36 ms
Memory Usage: 13 MB
后经过查询资料发现利用Python中的zip()函数和set()函数更加优化。
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
解题思路是将strs通过zip()函数打包成一个个元组,利用 * 号操作符解压返回一个个二维矩阵式s,再利用set()函数去重,当s的长度等于1时则前缀相同,写入字符串prefix中,否则结束,最后返回字符串prefix。
实现代码如下:
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
prefix = ""
for s in zip(*strs):
if len(set(s)) == 1:
prefix += s[0]
else:
break
return prefix
Runtime: 28 ms
Memory Usage: 12.9 MB