LeetCode 20. 有效的括号
Posted xiaoXingcode-go
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 20. 有效的括号相关的知识,希望对你有一定的参考价值。
题目链接:LeetCode 20. 有效的括号
题意:
给定一个只包括 \'(\',\')\',\'\',\'\',\'[\',\']\' 的字符串 s ,判断字符串是否有效。
解题思路:
括号匹配是栈的经典应用场景,具体操作如下:
1. 对于所有的左括号,进栈
2. 对于所有的右括号,弹出栈顶元素,判断是否与当前元素匹配,若不匹配,则return false
3. 最后判断栈中是否还有元素,如果还有剩余元素,则说明有多余括号,不匹配
完整代码如下:
func isValid(s string) bool
ss:=[]rune(s)
n:=len(ss)
if n % 2 == 1
return false
var st []rune
for i:=0;i<n;i++
if ss[i] == \'(\' || ss[i] == \'\' || ss[i] == \'[\'
//入栈
st = append(st,ss[i])
else
m:=len(st)
if m == 0
return false
tmp := st[m-1]
st = st[:m-1]
if ss[i] == \'\' && tmp != \'\' || ss[i] == \')\' && tmp != \'(\' || ss[i] == \']\' && tmp != \'[\'
return false
k:=len(st)
return k==0
也可以结合map简化操作,代码如下:
func isValid(s string) bool
hash := map[byte]byte\')\':\'(\', \']\':\'[\', \'\':\'\'
stack := make([]byte, 0)
if s == ""
return true
for i := 0; i < len(s); i++
if s[i] == \'(\' || s[i] == \'[\' || s[i] == \'\'
stack = append(stack, s[i])
else if len(stack) > 0 && stack[len(stack)-1] == hash[s[i]]
stack = stack[:len(stack)-1]
else
return false
return len(stack) == 0
LeetCode - 20 :有效的括号
原题目:
给定一个只包括 ‘(‘,‘)‘,‘{‘,‘}‘,‘[‘,‘]‘ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
解题思想:
通过观察可以发现,有效的括号都至少具有一组左括号和右括号相邻的情况,然后可以将这一部分由相邻左右括号构成的子串去掉,判断剩下部分的有效性。(这一点就像自己计算数学题一样,一般都是先计算最深层的括号,然后得到数之后,再计算下一层的括号,直到最后一层),具体解题思路如下:
1、构建右括号和左括号之间的映射;
2、建立一个栈,遍历字符串,遇到左括号将其放到栈里面,遇到右括号,根据步骤1中的映射关系,判断栈顶的括号是否与该右括号构成有效括号,如果不构成,直接返回false,如果是有效的,弹出栈顶元素,继续遍历;(栈数据结构是后进先出,因此用栈来存储已遍历的括号字符)
3、判断最终栈是否为空,如果不为空,则不是有效括号。
题解:
1 class Solution { 2 public static boolean isValid(String s) { 3 HashMap<Character , Character> maps = new HashMap<>(); 4 int len = s.length(); 5 if(len % 2 != 0) return false; //长度为奇数,直接返回false 6 maps.put(‘)‘, ‘(‘); 7 maps.put(‘}‘, ‘{‘); 8 maps.put(‘]‘, ‘[‘); 9 Stack<Character> stack = new Stack<Character>(); 10 for (int i = 0; i < s.length(); i++) { 11 char c = s.charAt(i); 12 if (maps.containsKey(c)) { 13 char topElement = stack.empty() ? ‘#‘ : stack.pop(); 14 if (topElement != maps.get(c)) { 15 return false; 16 } 17 } else { 18 stack.push(c); 19 } 20 } 21 return stack.isEmpty(); 22 } 23 }
以上是关于LeetCode 20. 有效的括号的主要内容,如果未能解决你的问题,请参考以下文章