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

Как Проверить Наличие Сбалансированных Скобок В Строке (Каждый Разработчик Должен Знать Это Для Того, Чтобы Лучше Думать)

Тогда, когда я начал программировать, я ненавидел структуры данных и алгоритмы, потому что все были такими… Помеченный алгоритмами, java.

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

В чем проблема?

Вам необходимо проверить наличие сбалансированных скобок в строке. Строка со сбалансированными скобками означает, что она содержит открывающие скобки того же типа (например, квадратные скобки, угловые скобки и т. Д.) В той же степени, что и закрывающие скобки того же типа. Например, строка содержит 99 открывающих угловых скобок (‘<‘), а также 99 закрывающих угловых скобок (‘>’). Кроме того, скобки не могут перекрывать друг друга. Например, “([)]” не сбалансирован. Напротив, “{()}[]” сбалансирован.

Идея

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

На протяжении всего нашего путешествия от первого элемента до последнего мы будем хранить все открывающие скобки (будь то угловые скобки, квадратные скобки, открывающие скобки и т. Д.) Внутри стека. Напротив, когда мы сталкиваемся с закрывающими скобками, мы не будем их сохранять, скорее мы вытащим элемент из существующего стека и сравним, являются ли оба эти элемента парами (‘<‘ и ‘>’ являются парами, ‘[‘ и ‘]’ являются парами). Если да, то все хорошо, и струна сбалансирована. Если нет, то строка не является сбалансированным выражением. Я не хочу писать так много, что это может вас смутить поэтому я покажу фрагмент кода на Java, чтобы решить эту проблему. Во всем фрагменте кода я буду писать комментарии, чтобы вы лучше поняли это решение.

Осуществление

import java.util.*;

class BalancedBrackets {
// We need to store all opening brackets in a list
// and closing brackets in another.
// How do we make sure an opening bracket
// relates with another (such as '<' relates to '>')?
// The way is to put them in the same index in the two lists
// although they are in different lists.
  private final List < Character > leftBrackets = Arrays.asList('(', '[', '{', '<');
  private final List < Character > rightBrackets = Arrays.asList(')', ']', '}', '>');

  public boolean balancedBrackets(String str) {
    Stack  stack = new Stack <> ();

    for (char ch: str.toCharArray()) {
// if current character is a left bracket, push it to the stack
      if (isLeftBracket(ch))
        stack.push(ch);

      if (isRightBracket(ch)) {
// If current character is a right bracket, don't push it to the 
// stack rather pop an existing item in the stack and compare if 
// these two brackets are related to each other. Before that, if 
// the stack is empty and the current character is a closing 
// bracket, we don't need to do a lot of thinking rather we can 
// just return false because for every closing bracket, there must 
// be an opening bracket waiting in the stack to be popped. 
// Therefore, empty stack means things went wrong, so return false 
// immediately.
        if (stack.empty())
          return false;

        var top = stack.pop();
        if (!bracketsMatch(top, ch))
          return false;
      }
    }

    return stack.empty();
  }

  private boolean isLeftBracket(char ch) {
    return leftBrackets.contains(ch);
  }

  private boolean isRightBracket(char ch) {
    return rightBrackets.contains(ch);
  }

// This method checks if an opening bracket matches with another 
// (for example, '<' matches with '>', '(' matches with ')', and 
// so on). For this method to work, we need to make sure each 
// index in the two lists hold the brackets of same type. For 
// example, at index 2 in first list, if the element is '<', then 
// then in index 2 in second list the element must be matching, in 
// this case '>'.
  private boolean bracketsMatch(char left, char right) {
    return leftBrackets.indexOf(left) == rightBrackets.indexOf(right);
  }
}

Отражение

Вот как вы решаете эту проблему. Давайте немного проанализируем временную и пространственную сложность этого решения. Временная сложность составляет O (n), потому что мы повторяем каждый элемент один раз. Если строка больше, то время, затраченное на вычисление строки, будет линейно больше. Сложность пространства также равна O (n), потому что при большем количестве скобок нам линейно требуется дополнительное пространство для их хранения.

Оригинал: “https://dev.to/ishakmohmed/how-to-check-for-balanced-brackets-in-a-string-every-developer-must-know-this-to-think-better-4pg8”