Как правильно определять скобки уровней

Дано выражение из круглых скобок. Его нужно изменить:

  • скобки 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: Перечитал условие - кажется, надо не так? Уровни считаются не снаружи, а изнутри? Это точно?

tio.run

#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;
}
((()))(()(()(()(()()))))
([{}])([][{}{{}{{}{}}}])
→ Ссылка