input: Write a python function to search for a substring in a given string using a Trie data structure.
  assert search("hello", "hell") == True
  assert search("hello", "hello") == True
  assert search("hello", "world") == False
  assert search("trie", "tr") == True
  assert search("datastructure", "data") == True
  assert search("datastructure", "structure") == True
  assert search("datastructure", "algo") == False
output: class TrieNode:
      def __init__(self):
          self.children = {}
          self.is_end_of_word = False
  
  class Trie:
      def __init__(self):
          self.root = TrieNode()
      
      def insert(self, word):
          node = self.root
          for char in word:
              if char not in node.children:
                  node.children[char] = TrieNode()
              node = node.children[char]
          node.is_end_of_word = True
      
      def search_prefix(self, prefix):
          node = self.root
          for char in prefix:
              if char not in node.children:
                  return False
              node = node.children[char]
          return True
  
  def search(string, substring):
      trie = Trie()
      trie.insert(string)
      return trie.search_prefix(substring)