Как реализовать задачу на пайтоне?
Решение первого варианта:
word1 = 'aabc'
word2 = 'aabacdff'

if any(word2.count(letter) < word1.count(letter) for letter in set(word1)):
    option = 'нельзя'
else:
    option = 'можно'

print(f'Первое слово {option} составить из букв второго')
Ещё эффективнее будет через Counter (обратите внимание на редкое использование unary minus):
from collections import Counter

counter = Counter(word2)
counter.subtract(word1)

option = ('можно', 'нельзя')[bool(-counter)]

print(f'Первое слово {option} составить из букв второго')

Со вторым вариантом задачи разберитесь сами, модифицируя код.
Решение за O(n + k), n - длина первой строки, k - длина второй строки:

Создадим словарь, в котором будем хранить количество вхождений каждой из букв первого слова. Например, "hello", будет представлено в словаре:
{
'h' : 1, 
'e' : 1,
'l' : 2,
'o' : 1
} 

Далее просто пробегаемся по второму слову и проверяем, есть ли текущая буква в словаре. Если нет, то такое слово составить невозможно. Есть есть, то просто вычитаем у значения буквы в словаре единицу. Если не можем вычесть(не хватает букв в первом слове), то ответ тоже нет.

s1 = str(input())
s2 = str(input())

d = dict()

for i in range(len(s1)):
    if s1[i] not in d:
        d[s1[i]] = 1
    else:
        d[s1[i]] += 1


def check():
    for i in range(len(s2)):
        if s2[i] not in d:
            return "NO"
        if d[s2[i]] - 1 >= 0:
            d[s2[i]] -= 1
        else:
            return "NO"

    return "YES"


print(check())