ГоловнаВсі публікаціїКатегоріїПро проєкт

Задача на перевірку правильності розстановки дужок (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.04.2025 18:24

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

meme code
meme code@memecode
24.04.2025 20:17

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

meme code
meme code@memecode
24.04.2025 20:55

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

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

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

meme code
meme code@memecode
09.05.2025 19:27

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

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

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

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

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

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

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

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

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

meme code
meme code@memecode