原题
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入: [“flower”,“flow”,“flight”]
输出: “fl”
示例 2:
输入: [“dog”,“racecar”,“car”]
输出: “”
解释: 输入不存在公共前缀。
利用Trie树实现
class TrieNode(object):
# 利用Python定义Trie树指针
def __init__(self):
self.child = {}
self.flag = None
class Solution(object):
def __init__(self):
self.root = TrieNode()
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
if strs == []:
return ''
elif len(strs) == 1:
return strs[0]
for words in strs: # 将strs中所有字符串插入Trie树
curNode = self.root
for word in words:
if curNode.child.get(word) is None:
nextNode = TrieNode()
curNode.child[word] = nextNode
curNode = curNode.child[word]
curNode.flag = 1
curNode = self.root
lcp = []
while curNode.flag != 1: # 遍历Trie树,直至当前节点的子节点分叉数大于1
if len(curNode.child) == 1:
lcp.append(list(curNode.child.keys())[0])
curNode = curNode.child[list(curNode.child.keys())[0]]
else:
break
return ''.join(lcp)
Trie树简化版
- 相当于Trie数的简化版,只是省却了建树的操作
- 利用zip将strs的所有元素对应位打包为一个list,利用set()将这个list去重,则剩下的个数就是无重复的字符个数,如果为1就代表是公共前缀之一,继续向下遍历
- 例如输入[“flower”,“flow”,“flight”],zip(*strs)的结果就是[[‘f’, ‘f’, ‘f’], [‘l’, ‘l’, ‘l’], [‘o’, ‘o’, ‘i’], [‘w’, ‘w’, ‘g’]],set()后的结果分别为[[‘f’], [‘l’], [‘o’, ‘i’], [‘w’, ‘g’]]
class Solution(object):
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
if strs == []:
return ''
elif len(strs) == 1:
return strs[0]
lcp= ""
for each in zip(*strs):
if len(set(each)) == 1:
lcp += each[0]
else:
return lcp
return lcp