Рубрики
Без рубрики

Алгоритзы проблемы решения: драгоценности и камни

Решение алгоритмов с TK. Теги с алгоритмами, Python, Computerscience, интервью.

Алгоритмы проблемы решения серии (23 части серии)

Этот пост является частью Алгоритмы проблемы решения ряд. И это было изначально опубликовано в Блог TK Отказ

Описание проблемы

Это Драгоценности и камни проблема. Описание выглядит так:

Вы даны строки J Представляя типы камней, которые являются драгоценностями, и S представляя камни, которые у вас есть. Каждый персонаж в S это тип камня, который у вас есть. Вы хотите знать, сколько у вас камней, тоже драгоценности.

Буквы в J гарантированы различными, и все персонажи в J и S буквы. Письма чувствительны к регистру, поэтому «А» считается другим типом камня от «А» Отказ

Примеры

# input: J = "aA" | S = "aAAbbbb"
# output: 3

# input: J = "z", S = "ZZ"
# output: 0

Решение

Сначала я пытался понять некоторые угловые случаи. Например, что я должен вернуться, если J или S это пустая строка?

Как мой первый раствор, решение грубой силы, мне нужно было просмотреть строку. Поэтому мне не нужно было заботиться о пустых струнах. Для пустых строк он не циклирует, он просто возвращает счетчик по умолчанию, в этом случае 0 Отказ

Мне просто нужно было петлю через J А для каждого персонажа в J Строка, мне нужно сравнить с каждым персонажем S . Если они совпадают, я увеличиваю счетчик.

После зацикливания каждый символ просто верните конечный счетчик.

def num_jewels_in_stones(J, S):
    jewels = 0

    for j in J:
        for s in S:
            if s == j:
                jewels += 1

    return jewels

print(num_jewels_in_stones("aA", "aAAbbbb")) # 3
print(num_jewels_in_stones("z", "ZZ")) # 0

Это O (n ^ 2) решение с точки зрения сложности времени. Или более предварительно предыдущие: O (len (j) * len (s)) . Для космической сложности это O (1) Как мы просто храним ценность в счетчике. Если Лен (j) или ЛЕН (S) Увеличение, используемое пространство постоянно постоянно.

Просто чтобы повторить это решение, мы можем сделать это O (n) С точки зрения сложности времени с помощью хэш-таблица для хранения всех символов в качестве ключа и счетчика в качестве значения.

def num_jewels_in_stones_opt(J, S):
    chars_counter = {}
    counter = 0

    for char in J:
        if char in chars_counter:
            chars_counter[char] += 1
        else:
            chars_counter[char] = 1

    for char in S:
        if char in chars_counter:
            counter += chars_counter[char]

    return counter

print(num_jewels_in_stones_opt("aA", "aAAbbbb")) # 3
print(num_jewels_in_stones_opt("z", "ZZ")) # 0

Итак, для каждого J характер. Убедитесь, что он уже в Chars_Counter Отказ Если это так, просто увеличивайте его. Если нет, инициализируйте счетчик.

Тогда для каждого S Персонаж, проверка, если этот символ находится в chars_counter. . Если это, получить его и добавьте в счетчик Переменная. Если нет, ничего не делай.

После этой итерации нам нужна окончательная стоимость счетчик Отказ Просто верните это.

Как мы уже говорили, он работает в O (n) Отказ Лучше первого решения. Но для наихудшего сценария космическая сложность – O (n) , хуже первого подхода.

Для получения дополнительных историй и постов о моем обучении и освоении программного обеспечения для изучения программного обеспечения, посмотрите, что Я пишу и документировал Отказ

Мой Twitter & Github Отказ ☺

Ресурсы

Алгоритмы проблемы решения серии (23 части серии)

Оригинал: “https://dev.to/teekay/algorithms-problem-solving-jewels-and-stones-1aab”