Алгоритмы проблемы решения серии (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”