В
isValid("(foo)вкп()"); // true
isValid("(foo)"); // true
isValid("(f[o]{o})"); // true
isValid("[(){}()()]"); // true
isValid("(foo"); // false — нет закрывающей
isValid("{f[o}o]"); // false — скобки пересекаются
Задаешь стэк.
Проходишься циклом по строке, проверяешь, является ли символ открывающим, если да, кладёшь в стэк, если символ закрывающий, снимаешь значение со стэка, проверяешь соответствует ли этот открывающий символ закрывающему, если нет, значит скобки пересекаются, возвращаешь false.
После цикла смотришь, если стэк пуст, то скобки были расставлены корректно, иначе строка не валидна