20.给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
【思路】
和诺瓦科技的笔试题是一样的,不过这里复杂的是有三种类型的括号,所以首先需要定义一个哈希表把三种括号保存起来。然后将输入的字符串从左到右判断,当一个字符为右括号的时候就是不合法的。当字符串为左括号时则入栈,当为右括号时需要看其是否能够与左括号匹配起来,当都不满足时返回false,最后根据栈是否为空来判断是否括号都能匹配上。
【运行代码】
package leetcode_50;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Stack;
import javax.imageio.event.IIOReadWarningListener;
public class Leetcode_20 {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
boolean result;
result=isValid(s);
System.out.print(result);
}
private static boolean isValid(String s) {
Map<Character, Character> map=new HashMap<>();
map.put('(', ')');
map.put('{', '}');
map.put('[', ']');
char[] ch=s.toCharArray();
Stack<Character> stack=new Stack<>();
if(s.length()>0&&!map.containsKey(ch[0])) return false;
for(int i=0;i<s.length();i++){
if(stack.isEmpty()||map.containsKey(ch[i])){
stack.push(ch[i]);
//System.out.print(stack.peek()+"aaa");
}
else if(map.get(stack.peek())==ch[i])
stack.pop();
else
return false;
}
return stack.isEmpty();
}
}