А для проблемы сокращений на Hackerrank я набрал следующее решение (на самом деле это просто рекурсивное решение, использующее преимущества неявной мемоизации, которую мы можем получить от декоратора кэша).
Код: Выделить всё
def abbreviation(a, b):
n, m = len(a), len(b)
@lru_cache(maxsize=n*m)
def abbreviation_helper(i,j):
global a,b
if i < j:
return False
if j == -1:
if a == -1 or all([a[x].islower() for x in range(i)]):
return True
if a[i].isupper() and a[i] != b[j]:
return False
if a[i].upper() == b[j]:
return abbreviation_helper(i-1, j-1) or abbreviation_helper(i-1, j)
else:
return abbreviation_helper(i-1, j)
ret = abbreviation_helper(n-1,m-1)
if ret:
return "YES"
return "NO"
Что касается обозначения big o, мы знаем, что это асимптотически то же самое, что и использование восходящего подхода, так что же вызывает тайм-аут?
Я попробовал решение, используя подход «снизу вверх», и он отлично работает. У меня также изначально было решение, которое выполняло вызовы с аргументами, представляющими собой нарезанные строки, но я изменил вызовы, чтобы они принимали целые числа в качестве аргумента, в попытке дальнейшей оптимизации этого. Ожидал, что этого будет достаточно.
Подробнее здесь: https://stackoverflow.com/questions/790 ... hackerrank