题目描述:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
这道题,看起来有点无从下手,其实很简单,这道题用到了一种数据结构---栈。
简单介绍一下,栈一种线性表,允许在栈的一段进行插入删除。是一种后进先出的线性表。
明白了栈的基本概念,这道题就解决了。
思路很简单,就是将所有左括号入栈,然后判断输入的括号中是否有与栈中的左括号相匹配的,如果有就出栈,没有就返回false,最后判断栈是否为空,为空则为true,否则false.
例如:输入“{【()】}”将{,[,(入栈,然后判断出栈元素(与)是否匹配,匹配则继续寻找,继续出栈。
代码如下:
public static void main(String[] args){
// 第一种,将左边括号入栈,出栈时判断是否与与右边括号匹配.
String str = "{{{{{{()}}}}}}}";
// 栈,用栈最简单(栈的特点后进先出)
Stack<Character> s = new Stack <> ();
for (int i=0;i<str.length ();i++){
// 将字符串的元素付给char变量
char c = str.charAt ( i );
// 当是左边括号是入栈
if (c=='('||c=='['||c=='{'){
s.push ( c );
continue;
}
// 将出栈元素赋值给char变量
char pop=s.pop ();
// 当出栈元素(左边括号)和字符串中除了左边括号后的其他括号匹配时,继续执行,否则报错,不相等,不是正确括号.
if(pop=='('&&c==')'||pop=='['&&c==']'||pop=='{'&&c=='}') {
}
else{
System.out.println("出栈元素与剩与元素不相同");
}
}
if(s.isEmpty ()){
System.out.println("成功");
}else {
System.out.println("栈不为空失败");
}
pop=='('&&c==')'||pop=='['&&c==']'||pop=='{'&&c=='}')主要说这句话,判断出栈元素有没有匹配的元素,有就继续执行,没有就报错。
执行结果:
执行用时:
还有一种方法,也是用栈,不过使用map来做,执行时间有点长,但是也是一种很好理解的方法。都是将左边括号入栈,判断有没有与map中的值相同的元素,也就是能不能找到与左括号匹配的元素,找到就出栈,栈空则结束。
Stack<Character> s = new Stack <> ();
Map<Character,Character> map = new HashMap <> ( );
map.put('{','}');
map.put('(',')');
map.put('[',']');
for (int i=0; i<str.length ( ); i++){
if (map.get ( str.charAt ( i ) )!=null){
s.push ( str.charAt ( i ) );
}
else if (s.size()>0&&map.get(s.peek()).equals(str.charAt ( i ))){
s.pop ();
}else {
System.out.println("错误");
}
}
if (s.isEmpty ()){
System.out.println("成功");
}
执行用时:
这一种方法虽然没有第一种用时短,但也是一种很好理解,简便的方法。
总结:
这道题要是用暴力解法,可能要考虑的情况太多,代码量太多。本人这道题曾经在老师的数据结构课中遇到过,所以直接想到了用栈,虽然java栈的方法,不熟悉,但目标有了,实现也不是很费劲。
这道题很有价值,很值得的去多做几遍。多思考,本人java语法有点不熟悉,通过这个题,也对java栈语法有了更好的认识。继续努力。
2019-1-21记录