В программировании создание сбалансированных круглых скобок — распространенная задача, которая часто возникает в различных сценариях. Независимо от того, работаете ли вы с математическими выражениями, анализом синтаксиса или разработкой алгоритмов, умение эффективно генерировать круглые скобки является ценным навыком. В этой статье мы рассмотрим различные методы создания круглых скобок с использованием разговорного языка и приведем примеры кода, которые помогут вам овладеть этим важным навыком программирования.
Метод 1: метод грубой силы
Метод грубой силы — это самый простой метод создания круглых скобок. Он включает в себя генерацию всех возможных комбинаций круглых скобок и последующую проверку сбалансированных пар. Хотя это не самый эффективный подход, он полезен для понимания проблемы и может стать отправной точкой для оптимизации.
Вот пример реализации на Python:
def generate_parentheses(n):
def backtrack(s='', left=0, right=0):
if len(s) == 2 * n:
if valid(s):
result.append(s)
else:
if left < n:
backtrack(s + '(', left + 1, right)
if right < left:
backtrack(s + ')', left, right + 1)
def valid(s):
balance = 0
for char in s:
if char == '(':
balance += 1
else:
balance -= 1
if balance < 0:
return False
return balance == 0
result = []
backtrack()
return result
n = 3
print(generate_parentheses(n))
Метод 2: возврат с помощью мемоизации
Подход грубой силы можно оптимизировать с помощью обратного отслеживания с мемоизацией. Этот метод позволяет избежать избыточных вычислений за счет сохранения промежуточных результатов в справочной таблице. Тем самым мы устраняем дублирующиеся ветки и значительно сокращаем количество вызовов функций.
Вот пример реализации на JavaScript:
function generateParentheses(n) {
const memo = {};
function backtrack(s = '', left = 0, right = 0) {
if (s.length === 2 * n) {
if (valid(s)) {
result.push(s);
}
} else {
if (left < n) {
const key = s + '(';
if (!memo[key]) {
memo[key] = true;
backtrack(key, left + 1, right);
}
}
if (right < left) {
const key = s + ')';
if (!memo[key]) {
memo[key] = true;
backtrack(key, left, right + 1);
}
}
}
}
function valid(s) {
let balance = 0;
for (let char of s) {
if (char === '(') {
balance++;
} else {
balance--;
}
if (balance < 0) {
return false;
}
}
return balance === 0;
}
const result = [];
backtrack();
return result;
}
const n = 3;
console.log(generateParentheses(n));
Метод 3: формула каталонских чисел
Эффективной математической формулой для создания круглых скобок является использование каталонских чисел. n-е каталонское число представляет собой количество допустимых выражений в круглых скобках с n парами круглых скобок. Используя эту формулу, мы можем создавать круглые скобки без необходимости возврата.
Вот пример реализации на Java:
import java.util.ArrayList;
import java.util.List;
public class ParenthesesGenerator {
public List<String> generateParentheses(int n) {
List<String> result = new ArrayList<>();
if (n == 0) {
result.add("");
} else {
for (int i = 0; i < n; i++) {
for (String left : generateParentheses(i)) {
for (String right : generateParentheses(n - 1 - i)) {
result.add("(" + left + ")" + right);
}
}
}
}
return result;
}
public static void main(String[] args) {
ParenthesesGenerator generator = new ParenthesesGenerator();
int n = 3;
List<String> parentheses = generator.generateParentheses(n);
System.out.println(parentheses);
}
}
В этой статье мы рассмотрели три различных метода создания сбалансированных круглых скобок. Мы начали с подхода грубой силы, который хоть и прост, но не самый эффективен. Затем мы оптимизировали его, используя возврат с запоминанием, уменьшив избыточность и повысив производительность. Наконец, мы представили формулу каталонского числа, которая обеспечивает эффективное математическое решение проблемы.
Освоив эти методы, вы сможете эффективно создавать сбалансированные круглые скобки в своих проектах программирования, независимо от того, работаете ли вы с математическими выражениями, анализом синтаксиса или любым другим сценарием, включающим манипуляции со скобками.
Не забудьте выбрать метод, который лучше всего соответствует вашим потребностям, исходя из конкретных требований вашего проекта. Приятного кодирования!