-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path20-ValidParentheses.go
More file actions
149 lines (135 loc) · 4.27 KB
/
20-ValidParentheses.go
File metadata and controls
149 lines (135 loc) · 4.27 KB
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package main
// 20. Valid Parentheses
// Given a string s containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.
// An input string is valid if:
// Open brackets must be closed by the same type of brackets.
// Open brackets must be closed in the correct order.
// Example 1:
// Input: s = "()"
// Output: true
// Example 2:
// Input: s = "()[]{}"
// Output: true
// Example 3:
// Input: s = "(]"
// Output: false
// Constraints:
// 1 <= s.length <= 10^4
// s consists of parentheses only '()[]{}'.
import "fmt"
func isValid(s string) bool {
// 判断长度是否小于2
if len(s) < 2 {
return false
}
// 用stack就可很好处理golang没有原生的stack 这里使用一个array 和 int来处理
var a []string
var l = 0
for i := 0; i < len(s); i++ {
// 遇到 ([{ 就入栈
if '(' == s[i] || '[' == s[i] || '{' == s[i] {
a = append(a, string(s[i]))
l++
}
// 遇到)]} 就出栈 比对
if ')' == s[i] || ']' == s[i] || '}' == s[i] {
// 没有入栈过
if 0 == l {
return false
}
if ')' == s[i] && "(" != a[l-1] {
return false
}
if ']' == s[i] && "[" != a[l-1] {
return false
}
if '}' == s[i] && "{" != a[l-1] {
return false
}
a = append(a[0 : l-1])
l--
}
}
// 数组里没有完全出栈
if 0 != l {
return false
}
return true
}
// best solution
func isValidBest(s string) bool {
// 空字符串直接返回 true
if len(s) == 0 {
return true
}
stack := make([]rune, 0)
for _, v := range s {
if (v == '[') || (v == '(') || (v == '{') {
stack = append(stack, v)
} else if ((v == ']') && len(stack) > 0 && stack[len(stack)-1] == '[') ||
((v == ')') && len(stack) > 0 && stack[len(stack)-1] == '(') ||
((v == '}') && len(stack) > 0 && stack[len(stack)-1] == '{') {
stack = stack[:len(stack)-1]
} else {
return false
}
}
return len(stack) == 0
}
// stack + map
func isValid1(s string) bool {
var pairs map[string]string = map[string]string{
")": "(",
"}": "{",
"]": "[",
}
var stack []string
for _, c := range s {
ch := string(c)
size := len(stack)
if left, ok := pairs[ch]; ok {
if size == 0 || stack[size-1] != left {
return false
}
stack = stack[:size-1]
}else {
stack = append(stack, ch)
}
}
return len(stack) == 0
}
func main() {
// Example 1:
// Input: s = "()"
// Output: true
fmt.Println(isValid("()")) // true
// Example 2:
// Input: s = "()[]{}"
// Output: true
fmt.Println(isValid("()[]{}")) // true
// Example 3:
// Input: s = "(]"
// Output: false
fmt.Println(isValid("(]")) // false
fmt.Printf("isValid(\"((\") = %v\n",isValid("((")) // false
fmt.Printf("isValid(\"(\") = %v\n",isValid("(")) // false
fmt.Printf("isValid(\"(+\") = %v\n",isValid("()")) // true
fmt.Printf("isValid(\"({[()]})\") = %v\n",isValid("({[()]})")) // true
fmt.Printf("isValid(\"({[()}])\") = %v\n",isValid("({[()}])")) // false
fmt.Println(isValidBest("()")) // true
fmt.Println(isValidBest("()[]{}")) // true
fmt.Println(isValidBest("(]")) // false
fmt.Printf("isValidBest(\"((\") = %v\n",isValidBest("((")) // false
fmt.Printf("isValidBest(\"(\") = %v\n",isValidBest("(")) // false
fmt.Printf("isValidBest(\"(+\") = %v\n",isValidBest("()")) // true
fmt.Printf("isValidBest(\"({[()]})\") = %v\n",isValidBest("({[()]})")) // true
fmt.Printf("isValidBest(\"({[()}])\") = %v\n",isValidBest("({[()}])")) // false
fmt.Println(isValid1("()")) // true
fmt.Println(isValid1("()[]{}")) // true
fmt.Println(isValid1("(]")) // false
fmt.Printf("isValid1(\"((\") = %v\n",isValid1("((")) // false
fmt.Printf("isValid1(\"(\") = %v\n",isValid1("(")) // false
fmt.Printf("isValid1(\"(+\") = %v\n",isValid1("()")) // true
fmt.Printf("isValid1(\"({[()]})\") = %v\n",isValid1("({[()]})")) // true
fmt.Printf("isValid1(\"({[()}])\") = %v\n",isValid1("({[()}])")) // false
}