leetcode_20
2010 年 8 月 20 日
Golang:
思路:其实这题用栈的话很好解决,但Go里好像没有栈,我就用切片去实现了一个类似的栈,思路是,每当遇见 {
[
(
时,这些符号会进入切片(入栈),每当遇到 }
]
)
时,我们去查看切片尾端的符号是否是相对应的符号,不是则直接 return false
,是的话,切片会删除尾端的符号(出栈),在全部字符串处理完了以后,我们查看切片的长度,如果不为0,那么说明有符号没有配对成功,为0则说明成功了
注意:这里需要小心切片的长度问题,例:当我们去处理 "}()[]"
这个字符串时,遇见的第一个就是 }
符号,这时候查看切片尾端 res[len(res)-1]=='{'
可能会导致越界错误,因为此时res的长度为0。在这里我的处理方法是在每次判断时首先判断 len(res)!=0
,如果为0,则直接可以 return false
Tips:这里我采用了Leetcode评论区里的一个方法,先判断字符串长度是否为偶数,不是则直接返回false,个人觉得这是程序员编程时敏锐度的一个体现,也希望以后我可以做到这样
func isValid(s string) bool { if len(s)%2!=0{ return false } var res []byte for i:=0;i<len(s);i++{ switch s[i] { case '}': if len(res)!=0&&res[len(res)-1]=='{' { res=res[:len(res)-1] }else { return false } case ']': if len(res)!=0&&res[len(res)-1]=='[' { res=res[:len(res)-1] }else { return false } case ')': if len(res)!=0&&res[len(res)-1]=='(' { res=res[:len(res)-1] }else { return false } default: res = append(res, s[i]) } } if len(res)!=0{ return false }else{ return true } }