给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
1.自己的代码:利用一个辅助数组来模拟栈,没有匹配的括号就进栈,匹配成功的括号就出栈。
class Solution {
public boolean isValid(String s) {
int index = 0;
boolean isValid = true;
char c = ' ';
char[] chars = new char[s.length()];//创建一个辅助数组,类似栈的作用,存储每一个遍历到的字符
int charIndex = 0;//辅助数组的起始下标
while(index < s.length()){
c = s.charAt(index);
chars[charIndex++] = c;//将读到的字符存入辅助数组中
if(c == ')'){//如果此时遇到的是')'
if(charIndex == 1){//如果')'存在辅助数组中的第一个元素,说明错误
isValid = false;
break;
}
if(chars[charIndex - 2] == '('){//如果')'的前一个元素是'(',就说明配对成功,把下标回到出现这两个元素前
charIndex = charIndex - 2;
}else{//前一个元素不是'(',说明错误
isValid = false;
break;
}
}
//']'和'}'的情况与')'类似
if(c == ']'){
if(charIndex == 1){
isValid = false;
break;
}
if(chars[charIndex - 2] == '['){
charIndex = charIndex - 2;
}else{
isValid = false;
break;
}
}
if(c == '}'){
if(charIndex == 1){
isValid = false;
break;
}
if(chars[charIndex - 2] == '{'){
charIndex = charIndex - 2;
}else{
isValid = false;
break;
}
}
index++;
}
//如果辅助数组的下标不是初始值0,说明存在括号没有被匹配,也出现错误
if(charIndex != 0){
isValid = false;
}
return isValid;
}
}
上面的代码可以改进的地方:只要数量是奇数就说明肯定是错误的,就不需要再判断第一个元素是不是')'、']'、'}'这三种中的一个。
2.答案解法:利用了java自带实现的stack。
class Solution {
public boolean isValid(String s) {
int n = s.length();
if (n % 2 == 1) {//如果数量是奇数的话,那就肯定是错误的
return false;
}
//利用一个Map存储配对情况
Map<Character, Character> pairs = new HashMap<Character, Character>() {{
put(')', '(');
put(']', '[');
put('}', '{');
}};
//定义一个栈空间
Deque<Character> stack = new LinkedList<Character>();
for (int i = 0; i < n; i++) {//遍历每个字符
char ch = s.charAt(i);
if (pairs.containsKey(ch)) {//如果是map中包含的字符,即三种右括号中的一种
if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {//栈为空或者栈顶元素的相对应的括号不匹配,说明错误
return false;
}
stack.pop();//将匹配成功的出栈
} else {//如果是三种左括号,就直接压栈
stack.push(ch);
}
}
return stack.isEmpty();//栈为空返回true,说明匹配成功;否则返回false,匹配不成功。
}
}
题源:力扣