Skip to content

Commit 2ff195a

Browse files
authored
Merge pull request #887 from bus710/week06
[bus710] Week 06
2 parents e7df407 + 19a9f82 commit 2ff195a

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed

valid-parentheses/bus710.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package hello
2+
3+
import (
4+
"strings"
5+
)
6+
7+
const (
8+
openChar = "({["
9+
closeChar = ")]}"
10+
)
11+
12+
func isValid(s string) bool {
13+
ss := strings.Split(s, "")
14+
stack := []string{}
15+
16+
// If the very first one is not an opening character,
17+
// no need to check followings
18+
if !strings.Contains(openChar, ss[0]) || !strings.Contains(closeChar, ss[len(ss)-1]) {
19+
return false
20+
}
21+
22+
// If the length is not even, there is an incomplete pair
23+
if len(ss)%2 == 1 {
24+
return false
25+
}
26+
27+
// Loop over the slice to check
28+
// - If the current one is an opening one, then push into the stack
29+
// - If the current one is a closing one, then pop and compare with the previous one from the stack
30+
for _, c := range ss {
31+
if strings.Contains(openChar, c) {
32+
stack = append(stack, c)
33+
} else if strings.Contains(closeChar, c) {
34+
if len(stack) == 0 {
35+
return false
36+
}
37+
prev := stack[len(stack)-1]
38+
39+
switch {
40+
case prev == "(" && c == ")":
41+
fallthrough
42+
case prev == "[" && c == "]":
43+
fallthrough
44+
case prev == "{" && c == "}":
45+
stack = stack[:len(stack)-1]
46+
default:
47+
stack = append(stack, c)
48+
}
49+
} else {
50+
// In case of non-parenthesis character found
51+
return false
52+
}
53+
}
54+
return len(stack) == 0
55+
}

0 commit comments

Comments
 (0)