[leetcode] 利用Python及Trie树实现 [14.最长公共前缀]

原题

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 “”。

示例 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

    原文作者:Trie树
    原文地址: https://blog.csdn.net/Real_Brilliant/article/details/87073050
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞