-
Notifications
You must be signed in to change notification settings - Fork 0
/
scalable_solutions.go
92 lines (77 loc) · 1.55 KB
/
scalable_solutions.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// about 40 minutes
// I was told that I should use stack
// Google for example of stack realisation in Go
package main
import "fmt"
func main() {
fmt.Println(isValidString("([{}))))"))
fmt.Println(isValidString("([{}[]()])))"))
fmt.Println(isValidString("([{}["))
}
func isValidString(str string) bool {
var stringInvalid bool
stk := new(stack)
for i := 0; i < len(str); i++ {
if stringInvalid {
break
}
currentChar := bracket(str[i])
prevChar := stk.Pop()
if prevChar == "" {
stk.Push(currentChar)
continue
}
if currentChar.GetType() == prevChar.GetType() && prevChar.IsClosing() != currentChar.IsClosing() {
continue
}
if !prevChar.IsClosing() && currentChar.IsClosing() && currentChar.GetType() != prevChar.GetType() {
stringInvalid = true
break
}
stk.Push(prevChar)
stk.Push(currentChar)
}
if !stringInvalid && !stk.IsEmpty() {
stringInvalid = true
}
return !stringInvalid
}
type bracket string
func (b *bracket) GetType() string {
switch *b {
case "[", "]":
return "square"
case "{", "}":
return "figure"
default:
return "round"
}
}
func (b *bracket) IsClosing() bool {
switch *b {
case "]", "}", ")":
return true
default:
return false
}
}
type stack [] bracket
func (s *stack) Push(value bracket) bool {
*s = append(*s, value)
return true
}
func (s *stack) Pop() bracket {
if len(*s) == 0 {
return ""
}
idx := len(*s) - 1
element := (*s)[idx]
*s = (*s)[:idx]
return element
}
func (s *stack) IsEmpty() bool {
return len(*s) == 0
}
func (s *stack) GetLength() int {
return len(*s)
}