Вот один простой способ.
def isComposedOf(A, B):
bset = set(B)
for c in A:
if c not in bset:
return False
return True
Этот алгоритм обходит каждую строку один раз, поэтому он выполняется за O (len (A) + len (B)).
Когда ответ положительный, вы не можете сделать сравнение лучше чем len (A) даже в лучшем случае, потому что независимо от того, что вы должны проверять каждую букву. И в худшем случае один из символов в A скрыт очень глубоко в B. Поэтому O (len (A) + len (B)) является оптимальным с точки зрения производительности в худшем случае.
Точно так же: когда ответ «нет», вы не можете сделать лучше, чем len (B) сравнения даже в лучшем случае; и в худшем случае символ, которого нет в B, очень глубоко спрятан в A. Поэтому O (len (A) + len (B)) снова оптимально.
Вы можете уменьшить постоянный коэффициент, используя лучшую структуру данных для bset
.
Вы можете избежать сканирования всего B в некоторых (не наихудших) случаях, когда ответ положительный, создавая его лениво, сканируя все больше B каждый раз, когда вы обнаруживаете в A символ, которого вы раньше не видели. *