LeetCode题目:有效的符号

题目描述:

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true

示例 2:
输入: “()[]{}”
输出: true

示例 3:
输入: “(]”
输出: false

示例 4:
输入: “([)]”
输出: false

示例 5:
输入: “{[]}”
输出: true

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

括号的运算是里面的先运算,外面的后运算,或者说是先写的后运算,后写的先运算。这个提点可以联想起堆栈的工作特点:先进的后出,后进的先出。这道题目用堆栈就可以简单的实现:遍历字符串的所有字符,遇到‘(’,‘[’,‘{’的时候,就将内容推进堆栈里,遇到‘)’,‘]’,‘}’的时候,将最近推进堆栈的内容推出,并做比较,如果能够配对的,就继续看下一个字符,如果不能配对的,括号字符串就失效了。最后遍历完所有字符之后,检查堆栈里面是不是空的,如果是空了,说明每个字符都配对成功了,返回字符串有效。
注意:题目说明空格符是有效字符串,在遍历字符串前,最好先通过一个循环去掉所有的空格。
代码(Java):

public class doingmyself {
	public static void main(String[] args) {
		String s = "(([]){})";
		System.out.println(isValid(s));
	}
	
	public static boolean isValid(String s) {
		if(s.length()==0) return true;  //没有输入任何括号的情况,自然不会出错的
		char[] arr = s.toCharArray();
		StringBuilder sb = new StringBuilder();
		for(char c:arr) {  //空格符是有效符号,通过转换为字符数组,去掉所有的空格
			if(c!=' ') sb.append(c);
		}
		char[] arr1 = sb.toString().toCharArray(); //去掉所有的空格后,变回字符数组
		Stack<Character> stack = new Stack<Character>();  //创建一个新的堆栈
		for(int i=0;i<arr.length;i++) {  //遍历新的字符数组,把每一个字符拿出来
			switch(arr[i]) {  //如果遇到的是 '(''[''{',就把他们推进堆栈里
			case '(':		  //如果遇到的是 ')'']''}',就把最近一个推进堆栈的内容拿出来,看是否能够配对,如果不能配对就是无效,能配对还要看下一个字符
				stack.push(arr[i]);
				break;
			case '[':
				stack.push(arr[i]);
				break;
			case '{':
				stack.push(arr[i]);
				break;
			case ')':
				if(stack.isEmpty() || stack.pop()!='(') {
					return false;
				}
				break;
			case ']':
				if(stack.isEmpty() || stack.pop()!='[') {
					return false;
				}
				break;
			case '}':
				if(stack.isEmpty() || stack.pop()!='{') {
					return false;
				}
				break;
			}
		}
		return stack.isEmpty(); //最后,所有的字符都执行完了,如果堆栈里没有内容,就表示有效
    }
}

你可能感兴趣的:(习题)