描述
Write a function called that takes a string of parentheses, and determines if the order of the parentheses is valid. The function should return true if the string is valid, and false if it’s invalid.
Examples
“()” => true
“)(()))” => false
“(” => false
“(())((()())())” => true
分析
方法1:
我们可以对’(‘计数,遍历字符串,遇到’(‘就递增,遇到’)‘递减。如果在每次遍历过程中,发现计数小于0,说明’)‘数目超过了之前的’(‘数目,该’)‘已不存在配对的’(’,直接判断非法。遍历完成后,如果计数器大于0,说明有多余的’(‘没有配对,判断非法,否则合法。
方法2:
利用正则表达式解析器。如果所有圆括号配对,该pattern是可以正确解析的,否则我们可以认为非法。
方法3:
不断将字符串中的"()“删除,直到字符串中再没有”()",此时,如果字符串为空,则说明全部配对,否则说明有未配对的圆括号存在。
方法4:
利用辅助栈。遍历字符串,如果遇到’(’,则压栈;遇到’)’,如果辅助栈非空,则执行一次出栈(栈内必定都是’(’),如果辅助栈为空,遇到无法匹配的’)’,认定非法。遍历完成后,如果辅助栈不为空,则非法,否则合法。
实现
方法1:
func ValidParentheses(parens string) bool {
c := 0
for _, v := range parens {
if v == '(' {
c++
} else {
c--
if c < 0 {
return false
}
}
return c == 0
}
}
方法2:
import "regexp"
func ValidParentheses(parens string) bool {
_, err := regexp.Compile(parens)
return err == nil
}
方法3:
import "strings"
func ValidParentheses(parens string) bool {
for strings.Contains(parens, "()") {
strings.Replace(parens, "()", "", -1)
}
return parens == ""
}
方法4:
func ValidParentheses(parens string) bool {
s := ""
for _, ch := range parens {
switch {
case s == "" && ch == ')':
return false
case ch == ')':
s = s[:len(s)-1]
default:
s += "("
}
}
return s == ""
}