Алгоритмы проблемы решения серии (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) , хуже первого подхода.
Для получения дополнительных историй и постов о моем обучении и освоении программного обеспечения для изучения программного обеспечения, посмотрите, что Я пишу и документировал Отказ
Ресурсы
- Обучение Python: Из грязи в князи
- Один месяц курс Python
- Обозначение Big-O для кодирования интервью и за пределами
- Учите питон с нуля
- Узнать объектно-ориентированное программирование в Python
- Структуры данных в Python: Освещенная интервью
Алгоритмы проблемы решения серии (23 части серии)
Оригинал: “https://dev.to/teekay/algorithms-problem-solving-jewels-and-stones-1aab”