Цейво!Всі публікаціїКатегоріїПро проєктДопомогти Україні 🇺🇦

Задача на перевірку правильності розстановки дужок (Ruby)

Обкладинка допису: Задача на перевірку правильності розстановки дужок (Ruby)
Умова для задачі наступна. Створіть функцію valid_braces, яка приймає рядок, що складається лише з дужок: ()[]{}.
 Функція повинна повертати true, якщо всі дужки відкриваються та закриваються в правильному порядку, або false — якщо дужки розставлені некоректно.
Приклад виконання методу:
valid_braces("()")         → true  
valid_braces("({[]})")     → true  
valid_braces("({[)]}")     → false  
valid_braces("(((()")      → false  
valid_braces("{[()]}[]")   → true

Як працює перевірка дужок?

Ця задача класично розв'язується за допомогою стека — структури даних, яка працює за принципом «останній увійшов — перший вийшов».
Ідея полягає в тому, щоб додавати відкривальні дужки в стек, а коли натрапляємо на закривальну дужку — перевіряти, чи відповідає вона тій, що на вершині стеку. Якщо так — видаляємо зі стеку; якщо ні — рядок невірний.

Тест (RSpec) для перевірки методу

RSpec.describe '#valid_braces' do
  it 'повертає true для валідних дужок' do
    expect(valid_braces('()')).to eq(true)
    expect(valid_braces('([])')).to eq(true)
    expect(valid_braces('{[()]}')).to eq(true)
    expect(valid_braces('{[()]}[]')).to eq(true)
  end

  it 'повертає false для невалідних дужок' do
    expect(valid_braces('[(])')).to eq(false)
    expect(valid_braces('({[)]}')).to eq(false)
    expect(valid_braces('((')).to eq(false)
    expect(valid_braces(']')).to eq(false)
  end
end

Метод valid_braces

def valid_braces(string)
  stack = []
  pairs = { ')' => '(', ']' => '[', '}' => '{' }

  string.each_char do |char|
    if pairs.values.include?(char)
      stack.push(char)
    elsif pairs.keys.include?(char)
      return false if stack.pop != pairs[char]
    end
  end

  stack.empty?
end

Принцип роботи алгоритму

  1. Кожного разу, коли бачимо відкриваючу дужку — додаємо її в стек.
  2. Якщо натрапили на закривальну — порівнюємо її з останньою відкривальною (з вершини стеку).
  3. Якщо збігаються — продовжуємо.
  4. Якщо ні — одразу повертаємо false.
  5. Якщо після проходу рядка стек порожній — всі дужки були правильно закриті, тому повертаємо true.
Цей підхід можна використовувати для парних символів будь-якого типу — не лише дужок. Він чудово підходить для перевірки правильності вкладених структур, наприклад, у парсерах або HTML-аналізаторах.

Цей допис поки що не має жодних доповнень від автора/ки.

Як курси Scratch допомагають дітям розвивати soft skills?
11 квіт., 18:24

Як курси Scratch допомагають дітям розвивати soft skills?

meme code
meme code@memecode
24 квіт., 20:17

Фіксимо minikube "You are trying to run the amd64 binary on an M1 system."

meme code
meme code@memecode
24 квіт., 20:55

Фіксимо minikube на Mac з М1 (відмовляємось від qemu, запускаємо на docker)

meme code
meme code@memecode
Де знайти старішу версію Google Chrome та скачати її? На прикладі старого Mac
25 квіт., 23:02

Де знайти старішу версію Google Chrome та скачати її? На прикладі старого Mac

meme code
meme code@memecode
09 трав., 19:27

[FIXED] cannot load such file -- html/pipeline (LoadError) виникає під час rails generate thredded:install

meme code
meme code@memecode
Задача: Перетворення римського числа на десяткове (Ruby)
20 трав., 12:05

Задача: Перетворення римського числа на десяткове (Ruby)

meme code
meme code@memecode
Як знайти підмасив з максимальною сумою (Maximum Subarray Sum) в Ruby
22 трав., 11:01

Як знайти підмасив з максимальною сумою (Maximum Subarray Sum) в Ruby

meme code
meme code@memecode
Реклама в Google для чайників: Покроковий гід для успішного старту
28 трав., 10:21

Реклама в Google для чайників: Покроковий гід для успішного старту

meme code
meme code@memecode
Що таке jemalloc і як він стосується Ruby / Ruby on Rails
30 трав., 11:53

Що таке jemalloc і як він стосується Ruby / Ruby on Rails

meme code
meme code@memecode
05 черв., 01:52

[Fixed] uninitialized constant ActiveSupport::LoggerThreadSafeLevel::Logger (NameError)

meme code
meme code@memecode
Прев'ю у network вкладці після оновлення Chrome стало дуже мале
05 черв., 18:23

Прев'ю у network вкладці після оновлення Chrome стало дуже мале

meme code
meme code@memecode
Що таке формат HEIC і чому просто перейменовувати його в .jpg — погана ідея
15 черв., 18:17

Що таке формат HEIC і чому просто перейменовувати його в .jpg — погана ідея

meme code
meme code@memecode