План курса / Все задачи / Алгоритмы и структуры данных
Удаление скобок
средне
# решено
Дана строка s, содержащая символы (, ) и буквы латинского алфавита. Нужно вернуть новую строку, в которой удалено минимальное количество скобок, чтобы строка стала правильной. Латинские символы должны остаться на своих местах.
Строка считается правильной, если каждой открывающей скобке соответствует закрывающая скобка, и нет лишних скобок без пары.
Если существует несколько вариантов удаления скобок, можно вернуть любой из них.
Пример 1:
Ввод: s = "((H)i)()))"
Вывод: "((H)i)()"
Пример 2:
Ввод: s = ")Alg(o)Code("
Вывод: "Alg(o)Code"
Пример 3:
Ввод: s = "Hi"
Вывод: "Hi"
Ограничения:
len(s) >= 1
using System.Text;
public class Solution
{
public static string MakeBalanced(string s)
{
List<char> result = new List<char>(s.ToCharArray());
List<int> stack = new List<int>(); // Храним индексы для символа '('
for (int i = 0; i < result.Count; ++i)
{
char charElem = result[i];
if (charElem == '(')
{
stack.Add(i); // Добавляем индекс открывающей скобки в стек
}
else if (charElem == ')' && stack.Count == 0)
{
// Скобка ")" лишняя и должна быть удалена
result[i] = '\0'; // Помечаем символ для удаления
}
else if (charElem == ')' && stack.Count > 0)
{
stack.RemoveAt(stack.Count - 1); // Удаляем индекс последней открывающей скобки
}
}
// Проходимся по всем лишним скобкам "(" и удаляем их
foreach (int i in stack)
{
result[i] = '\0'; // Помечаем символ для удаления
}
// Создаем строку из элементов списка, игнорируя символы '\0'
StringBuilder balanced = new StringBuilder();
foreach (char c in result)
{
if (c != '\0')
{
balanced.Append(c);
}
}
return balanced.ToString();
}
}
#include <string>
#include <vector>
using namespace std;
string makeBalanced(const string& s) {
vector<char> result(s.begin(), s.end());
vector<int> stack; // храним индексы для символа '('
for (int i = 0; i < result.size(); ++i) {
char charElem = result[i];
if (charElem == '(') {
stack.push_back(i);
} else if (charElem == ')' && stack.empty()) {
// скобка ")" лишняя и должна быть удалена
result[i] = '\0';
} else if (charElem == ')' && !stack.empty()) {
stack.pop_back();
}
}
// проходимся по всем лишним скобкам "(" и удаляем их
for (int i : stack) {
result[i] = '\0';
}
// делаем строку из элементов вектора, игнорируя символы '\0'
string balanced;
for (char c : result) {
if (c != '\0') {
balanced.push_back(c);
}
}
return balanced;
}
package main
func makeBalanced(s string) string {
// в Go строки неизменяемы, поэтому используем срез рун
result := []rune(s)
stack := []int{} // храним индексы для символа '('
for i := 0; i < len(result); i++ {
char := result[i]
if char == '(' {
stack = append(stack, i)
} else if char == ')' && len(stack) == 0 {
// скобка ")" лишняя и должна быть удалена
result[i] = 0
} else if char == ')' && len(stack) != 0 {
stack = stack[:len(stack)-1]
}
}
// проходимся по всем лишним скобкам "(" и удаляем их
for _, i := range stack {
result[i] = 0
}
// делаем строку из элементов среза рун, игнорируя пустые символы
balanced := []rune{}
for _, r := range result {
if r != 0 {
balanced = append(balanced, r)
}
}
return string(balanced)
}
import java.util.Stack;
class Solution {
public String makeBalanced(String s) {
// строки в Java неизменяемы, поэтому используем StringBuilder
StringBuilder result = new StringBuilder(s);
Stack<Integer> stack = new Stack<>(); // храним индексы для символа '('
for (int i = 0; i < result.length(); i++) {
char charElem = result.charAt(i);
if (charElem == '(') {
stack.push(i);
} else if (charElem == ')' && stack.isEmpty()) {
// скобка ")" лишняя и должна быть удалена
result.setCharAt(i, '\0');
} else if (charElem == ')' && !stack.isEmpty()) {
stack.pop();
}
}
// проходимся по всем лишним скобкам "(" и удаляем их
while (!stack.isEmpty()) {
result.setCharAt(stack.pop(), '\0');
}
// удаляем все '\0' символы и возвращаем строку
return result.toString().replace("\0", "");
}
}
from typing import *
def make_balanced(s: str) -> str:
# в python строки неизменяемы, поэтому нужно сделать список из символов,
# который уже можно менять
result = list(s)
stack = [] # храним индексы для символа (
for i in range(len(result)):
char = result[i]
if char == '(':
stack.append(i)
elif char == ')' and len(stack) == 0:
# скобка ")" лишняя и должна быть удалена
result[i] = ''
elif char == ')' and len(stack) != 0:
stack.pop()
# проходимся по всем лишним скобкам "(" и удаляем их
for i in stack:
result[i] = ""
# делаем строку из элементов списка
return "".join(result)
export function makeBalanced(s) {
// в javascript строки неизменяемы, поэтому нужно сделать список из символов,
// который уже можно менять
let result = s.split('');
let stack = []; // храним индексы для символа (
for (let i = 0; i < result.length; i++) {
let char = result[i];
if (char === '(') {
stack.push(i);
} else if (char === ')' && stack.length === 0) {
// скобка ")" лишняя и должна быть удалена
result[i] = '';
} else if (char === ')' && stack.length !== 0) {
stack.pop();
}
}
// проходимся по всем лишним скобкам "(" и удаляем их
for (let i of stack) {
result[i] = '';
}
// делаем строку из элементов списка
return result.join('');
}