计算前面出现的单词数

问题描述

我想问一下如何计算在给定字符串中的字母之前按字母顺序出现的单词数?

这是我的实现方式。

class TrieNode:
    # Trie node class
    def __init__(self):
        self.children = [None] * 26
        # isEndOfWord is True if node represent the end of the word
        self.isEndOfWord = False
        self.word_count = 0
class Trie:
    # Trie data structure class
    def __init__(self):
        self.root = self.getNode()

    def getNode(self):
        # Returns new trie node (initialized to NULLs)
        return TrieNode()

    def _charToIndex(self,ch):
        # private helper function
        # Converts key current character into index
        # use only 'a' through 'z' and lower case
        return ord(ch) - ord('a')

    def insert(self,key):
        # If not present,inserts key into trie
        # If the key is prefix of trie node,# just marks leaf node
        pCrawl = self.root
        length = len(key)
        for level in range(length):
            index = self._charToIndex(key[level])
            # if current character is not present
            if not pCrawl.children[index]:
                pCrawl.children[index] = self.getNode()
            pCrawl = pCrawl.children[index]
            # mark last node as leaf
        pCrawl.isEndOfWord = True
        pCrawl.word_count += 1

    def search(self,key):
        # Search key in the trie
        # Returns true if key presents
        # in trie,else false
        pCrawl = self.root
        length = len(key)
        for level in range(length):
            index = self._charToIndex(key[level])
            if not pCrawl.children[index]:
                return False
            pCrawl = pCrawl.children[index]
        return pCrawl is not None and pCrawl.isEndOfWord

    def count_before(self,string):
        cur = self.root
        for b in string:
            index = self._charToIndex(b)
            print(index)
            cur = cur.children[index]
            if cur is None:
                return 0
        return cur.word_count
def total_before(text):
    t = Trie()
    for i in range(len(text)):
        t.insert(text[i])
    
    a_list = [] # A list to store the result that occur before the text[i]
    for i in range(len(text)):
        result = t.count_before(text[i])
        a_list.append(result)
    return a_list

total_before(["bac","aaa","baa","aac"]) # Output will be [3,2,1]

我想知道如何计算在创建的trie中给定字符串之前出现的单词数。有人可以给我一个想法吗?

解决方法

我认为您使问题复杂化了。

def total_before(lst):
    return [sorted(lst).index(el) for el in lst]

print(total_before(["bac","aaa","baa","aac"])) 

输出:

[3,2,1]
,

由于word_count当前正在初始化,因此没有太大用处。仅在isEndOfWord设置为True的节点上它不为零。如果它计算依赖于当前节点的单词数,即在该节点中结束(您的代码现在开始计数)或在特里继续往下(当前不计算在内)的单词数,则将更为有用。 / p>

要实现这一点,请在降低Trie的同时增加word_count

    def insert(self,key):
        pCrawl = self.root
        length = len(key)
        for level in range(length):
            pCrawl.word_count += 1   # <-------------- added
            index = self._charToIndex(key[level])
            if not pCrawl.children[index]:
                pCrawl.children[index] = self.getNode()
            pCrawl = pCrawl.children[index]
        pCrawl.isEndOfWord = True
        pCrawl.word_count += 1

count_before中,您需要将要选择的子节点的所有word_count子节点的所有 def count_before(self,string): count = 0 # used to accumulate the word_counts cur = self.root for b in string: index = self._charToIndex(b) # add the word counts of the children that are to the left of this index: count += sum(node.word_count for node in cur.children[:index] if node) cur = cur.children[index] if cur is None: break return count 值相加,因为这些子节点代表前面的单词当前单词:

count += sum(node.word_count for node in cur.children[:index] if node)

此行:

mysum = 0
for node in cur.children[:index]:
    if node:
        mysum += node.word_count
sum += mysum

是一种紧凑的方式:

section {
  height: 100vh;
  display: block;
}