





import functools
from typing import Any


def       UpperCamelCase__(			UpperCamelCase__     :			str					,	UpperCamelCase__     :			list[str]    )->bool:

       # Validation
       if not isinstance(UpperCamelCase__					,	UpperCamelCase__    ) or len(UpperCamelCase__    ) == 0:
              raise ValueError('''the string should be not empty string'''    )

       if not isinstance(UpperCamelCase__					,	UpperCamelCase__    ) or not all(
           isinstance(UpperCamelCase__					,	UpperCamelCase__    ) and len(UpperCamelCase__    ) > 0 for item in words    ):
              raise ValueError('''the words should be a list of non-empty strings'''    )

       # Build trie
       A__		   =		{}
       A__		   =		'''WORD_KEEPER'''

       for word in words:
              A__		   =		trie
              for c in word:
                     if c not in trie_node:
                            A__		   =		{}

                     A__		   =		trie_node[c]

              A__		   =		True

       A__		   =		len(UpperCamelCase__    )

       # Dynamic programming method
       @functools.cache
       def is_breakable(UpperCamelCase__     :			int    ) -> bool:
              if index == len_string:
                     return True

              A__		   =		trie
              for i in range(UpperCamelCase__					,	UpperCamelCase__    ):
                     A__		   =		trie_node.get(string[i]					,	UpperCamelCase__    )

                     if trie_node is None:
                            return False

                     if trie_node.get(UpperCamelCase__					,	UpperCamelCase__    ) and is_breakable(i + 1    ):
                            return True

              return False

       return is_breakable(0    )


if __name__ == "__main__":
       import doctest

       doctest.testmod()












def       UpperCamelCase__(			UpperCamelCase__     :			str = "The quick brown fox jumps over the lazy dog"					,	)->bool:
       A__		   =		set()

       # Replace all the whitespace in our sentence
       A__		   =		input_str.replace(''' '''					,	''''''    )
       for alpha in input_str:
              if "a" <= alpha.lower() <= "z":
                     frequency.add(alpha.lower()    )
       return len(UpperCamelCase__    ) == 26


def       UpperCamelCase__(			UpperCamelCase__     :			str = "The quick brown fox jumps over the lazy dog"					,	)->bool:
       A__		   =		[False] * 26
       for char in input_str:
              if char.islower():
                     A__		   =		True
              elif char.isupper():
                     A__		   =		True
       return all(UpperCamelCase__    )


def       UpperCamelCase__(			UpperCamelCase__     :			str = "The quick brown fox jumps over the lazy dog"					,	)->bool:
       return len({char for char in input_str.lower() if char.isalpha()}    ) == 26


def       UpperCamelCase__(			)->None:
       from timeit import timeit

       A__		   =		'''from __main__ import is_pangram, is_pangram_faster, is_pangram_fastest'''
       print(timeit('''is_pangram()'''					,	setup=UpperCamelCase__    )    )
       print(timeit('''is_pangram_faster()'''					,	setup=UpperCamelCase__    )    )
       print(timeit('''is_pangram_fastest()'''					,	setup=UpperCamelCase__    )    )
       # 5.348480500048026, 2.6477354579837993, 1.8470395830227062
       # 5.036091582966037, 2.644472333951853,  1.8869528750656173


if __name__ == "__main__":
       import doctest

       doctest.testmod()
       benchmark()





