Тогда, когда я начал программировать, я ненавидел структуры данных и алгоритмы, потому что все говорили, что вы не будете инвертировать двоичное дерево в реальной работе и тому подобное. Однако, как только я это выучил, я понял, что это действительно очень полезно и заставило меня лучше мыслить как разработчика. Я понял, что я гораздо более гибок в плане поиска решения во время разработки, а также при работе с 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) { Stackstack = 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”