📅  最后修改于: 2023-12-03 15:28:48.433000             🧑  作者: Mango
这道题是一个经典的编程题目,是门|门 IT 2007年的第57题。它考察了程序员的算法和数据结构知识,同时也锻炼了程序员的编程能力。
给出一些字符串,求其中最长的一个公共前缀串。例如:
输入: ["flower","flow","flight"]
输出: "fl"
我们可以通过构造一个 Trie 树的方式来解决这个问题。trie 树(也叫前缀树或字典树)是一种树形结构,它是一种哈希树的变种。它的每个节点表示一个字符串(前缀),每个节点的所有子节点表示以该节点表示的字符串加上一个字符所表示的字符串(前缀)。
在构建 Trie 树的时候,我们可以把输入的字符串插入到 Trie 树中。在插入的过程中,如果发现某个节点的子节点数大于 1(也就是这个节点所表示的字符串不是所有字符串的公共前缀),就可以直接返回当前的节点所表示的字符串。
下面是一个 Python 的实现,其中 Trie
类表示 Trie 树。insert
方法用于将字符串插入到 Trie 树中。find_prefix
方法用于查找字符串的最长公共前缀。
class TrieNode():
def __init__(self):
self.children = {}
self.is_word = False
class Trie():
def __init__(self):
self.root = TrieNode()
def insert(self, word):
node = self.root
for c in word:
child = node.children.get(c)
if not child:
child = TrieNode()
node.children[c] = child
node = child
node.is_word = True
def find_prefix(self, word):
node = self.root
prefix = ''
for c in word:
child = node.children.get(c)
if child:
prefix += c
if child.is_word:
return prefix
node = child
else:
break
return prefix
class Solution():
def longestCommonPrefix(self, strs):
if not strs:
return ''
trie = Trie()
for s in strs:
trie.insert(s)
prefix = strs[0]
for s in strs[1:]:
prefix = trie.find_prefix(s)
if not prefix:
break
return prefix
通过这道题目,我们学习了 Trie 树的基本知识和应用。Trie 树是一种非常实用的数据结构,可以用于查找一组字符串中最长的公共前缀。