题目描述 给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。
示例 1: 输入: "()"
输出: true
示例 2: 输入: "()[]{}"
输出: true
思路1,创建一个空栈,当字符串不为空时,从第一个字符开始遍历字符串,如果遇到’(‘、’[‘、’{‘,就将字符压入一个栈中;如果遇到’)’、’]’、’}’,则判断此时栈顶的元素是否是对应的前括号比如')'对应'('
,如果满足对应关系,就将栈顶元素取出,继续遍历,如果不满足对应关系,则返回false。遍历完成后,如果栈不为空,返回false,反之返回true。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import java.util.Stack;class Solution { public boolean isValid (String s) { Stack<Character> stack = new Stack <>(); char [] arry = s.toCharArray(); for (int i=0 ;i<arry.length;i++){ if (arry[i]=='(' ||arry[i]=='[' ||arry[i]=='{' ) stack.push(arry[i]); else { char top = stack.peek(); if ((top=='(' &&arry[i]==')' )||(top=='[' &&arry[i]==']' )||(top=='{' &&arry[i]=='}' )) stack.pop(); else stack.push(arry[i]); } } return stack.isEmpty(); }
1 2 3 4 5 6 7 8 9 10 11 12 13 class Solution { public boolean isValid (String s) { Stack<Character> stack = new Stack <Character>(); for (char c: s.toCharArray()){ if (c=='(' ) stack.push(')' ); else if (c=='[' ) stack.push(']' ); else if (c=='{' ) stack.push('}' ); else if (stack.isEmpty()||c!=stack.pop()) return false ; } return stack.isEmpty(); } }
思路3,利用python的replace。一直遍历字符串,如果发现满足条件的括号对————‘()’、’[]’、’{}’,那么,将他们用空字符代替,如果最后,字符串为空,返回true,反之,返回false。
1 2 3 4 5 6 7 class solution (object ): def isValid (self, s ): while '()' in s or '[]' in s or '{}' in s: s = s.replace('()' , '' ) s = s.replace('[]' , '' ) s = s.replace('{}' , '' ) return s == ''
总结,括号总是成对的,在最内层一定存在相邻的成对存在的括号。