您的位置:首页 > 其它

LeetCode( Valid Parentheses)有效的括号

2018-01-12 10:08 387 查看
Given a string containing just the characters ‘(‘, ‘)’, ‘{‘, ‘}’, ‘[’ and ‘]’, determine if the input string is valid.

The brackets must close in the correct order, “()” and “()[]{}” are all valid but “(]” and “([)]” are not.法

乍一看这道题还是蛮熟悉的,确实本题也不难,但也是走了一些弯路。我之前做过一道类似的题,不过其中只有一种括号,解题思路:需要设一个整型变量,遍历一遍字符串,只要最后的结果不为零,便不有效(当然还有些特殊)。

于是,根据大脑信号,我的初始思路如下:设置了3个整型变量,每个变量对应一种括号,若为左括号,相对应的变量加一,若为右括号,相应的变量减一。根据最后的结果以及特殊情况进行最后的判断。(当然没有AC)代码:

int len = s.length();
char[] array = s.toCharArray();
int littleb = 0;
int midb = 0;
int bigb = 0;
for(int i=0;i<len;i++){
if(littleb < 0 || midb < 0 || bigb < 0){
return false;
}
switch(array[i]){
case '(':
littleb++;
break;
case ')':
littleb--;
break;
case '[':
midb++;
break;
case ']':
midb--;
break;
case '{':
bigb++;
break;
case '}':
bigb--;
break;
}
}
if(littleb ==0 && midb == 0 && bigb == 0){
return true;
}
return false;


写完后,感觉还挺简单的,潇洒的提交一下,73个案例通过了70个,我想是不是什么特殊情况没考虑到,失败的案例为“([)]”,我一看,不妙,我的思路不对。以我的思路,这种情况根本就没办法判断。失望之余不知从哪看到栈的身影,ok,思路来了:只要栈顶元素是左括号并且和当前元素是一对,那么就让出栈,不成对或者不是左括号则进栈。具体代码如下:

此处AC

public boolean isValid(String s) {
char[] array = s.toCharArray();
//使用HashMap来匹配相对应的括号
HashMap<Character,Character> map = new HashMap();
map.put('(',')');
map.put('[',']');
map.put('{','}');
Stack<Character> stack = new Stack();
int i = 0;
while(i < array.length){
if(!stack.empty()){
char top = stack.peek();
if(isLeft(top) && array[i] == map.get(top)){
stack.pop();
}else//不是右括号或者不匹配(开始我把这一步忘了)
stack.push(array[i]);
}else//栈空则入栈
stack.push(array[i]);
i++;
}
if(stack.empty())
return true;
return false;
}

public boolean isLeft(char c){
if('('== c || '{' == c || '[' == c)
return true;
return false;
}


后来在讨论区看到一个答案感觉很漂亮,他的思想:遍历字符数组,如果是左括号,就把相对应的右括号入栈,当遍历完左括号并开始遍历右括号了,把栈顶元素出栈,如果和数组当前元素相同,继续,否则结束。其代码如下:

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() || stack.pop() != c)

return false;

}

return stack.isEmpty();

}


这样,没有使用HashMap,也仅仅遍历一遍数组,空间消耗比我的少。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: