Как правильно определять скобки уровней
Дано выражение из круглых скобок. Его нужно изменить:
- скобки 1 уровня оставить круглыми,
- 2 уровня - заменить на квадратные,
- остальные на фигурные.
Подстрока '()' - 1 уровень. Пара скобок относится ко 2 уровню, если внутри неё только скобки 1ого уровня.
ввод:
((())())
вывод:
{[()]()}
Сейчас выводит почти правильно.
ввод:
((())())
вывод:
{([])()}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char s[300001];
scanf("%s", s);
int length = strlen(s);
char *result = (char *)malloc(length + 1);
int level = 0;
for (int i = 0; i < length; i++) {
if (s[i] == '(') {
if (level == 0) {
result[i] = '{';
} else if (level == 1) {
result[i] = '(';
} else {
result[i] = '[';
}
level++;
} else if (s[i] == ')') {
level--;
if (level == 0) {
result[i] = '}';
} else if (level == 1) {
result[i] = ')';
} else {
result[i] = ']';
}
}
}
result[length] = '\0';
printf("%s\n", result);
free(result);
return 0;
}
Ответы (1 шт):
Автор решения: Qwertiy
→ Ссылка
UPDATE: Перечитал условие - кажется, надо не так? Уровни считаются не снаружи, а изнутри? Это точно?
#include <stdio.h>
int main()
{
char s[256];
const char *op = "\0([{", *cl = "\0)]}";
int l = 1, e = 0;
scanf("%s", s);
for (char *p=s; *p; ++p)
{
if (*p == '(')
{
*p = op[l];
++*(!e && op[l+1] ? &l : &e);
}
else
{
--*(!e && op[l-1] ? &l : &e);
*p = cl[l];
}
}
puts(s);
return 0;
}
((()))(()(()(()(()()))))
([{}])([][{}{{}{{}{}}}])