📜  门|门 IT 2007 |第 57 题(1)

📅  最后修改于: 2023-12-03 15:28:48.433000             🧑  作者: Mango

门|门 IT 2007 |第 57 题

这道题是一个经典的编程题目,是门|门 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 树是一种非常实用的数据结构,可以用于查找一组字符串中最长的公共前缀。