Назад к вопросам
СБЕР
Middle+
3
// На вход подается строка s, содержащая только символы '(', ')', '[', ']', // Определите, является ли входная строка валидной. // Входная строка валидна, если: // - Все открытые скобки закрыты скобками того же типа. // - Скобки должны закрываться в правильном порядке. // - Каждой закрывающей скобке соответствует открытая скобка того же типа // () // func isValid(s string) bool { // }
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Для проверки валидности строки со скобками можно использовать стек. Идея в том, что при встрече открывающей скобки мы кладём её в стек, а при встрече закрывающей — проверяем, соответствует ли она последней открытой (верхнему элементу стека). Если нет — строка невалидна. В конце стек должен быть пуст.
Пример на Go:
type stack []rune
func (s *stack) push(r rune) {
*s = append(*s, r)
}
func (s *stack) pop() (rune, bool) {
if len(*s) == 0 {
return ' ', false
}
index := len(*s) - 1
elem := (*s)[index]
*s = (*s)[:index]
return elem, true
}
func isValid(s string) bool {
var st stack
pairs := map[rune]rune{')': '(', ']': '['}
for _, ch := range s {
switch ch {
case '(', '[':
st.push(ch)
case ')', ']':
top, ok := st.pop()
if !ok || pairs[ch] != top {
return false
}
}
}
return len(st) == 0
}