有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
我的思路是从字符串中间劈开,左右两端去做对应加减,刚好是0,就是一对。
我的解答
class Solution {
public boolean isValid(String s) {
if(s.length()%2 == 1){return false;}
String[] arr = s.split("");
for (int i = 0; i < arr.length; i++) {
if(arr[i].equals("(")){
arr[i] = "1";
} else if (arr[i].equals(")")) {
arr[i] = "-1";
} else if (arr[i] .equals("{")) {
arr[i] = "2";
} else if (arr[i] .equals("}")) {
arr[i] = "-2";
} else if (arr[i].equals("[")) {
arr[i] = "3";
} else if (arr[i].equals("]")) {
arr[i] = "-3";
}
}
for (int i = 0; i < arr.length/2; i++) {
if (!(Integer.valueOf(arr[i]) + Integer.valueOf(arr[arr.length - i - 1]) == 0 )) {
return false;
}
}
return true; }
}
但是我没有考虑到一对对出现的 例如 {}()[] 这种所以 就是不对的。
这个问题是一个比较有意思 我看了评论里面的大佬解答的:
if len(s)%2 != 0:
return False
while '()' in s or '[]' in s or '{}' in s:
s = s.replace('[]','').replace('()','').replace('{}','')
return True if s == '' else False
我看完人傻了,这个思路是和公共最长前缀的思路是一样的,减法计算,这种思路我觉得是一种考虑方式,但是需要变更字符串,因为String类型的字符串是final 修饰的,每次字符串变更都是开辟一次新的空间去存储这个String对象,相当于增加了内存的使用。这个问题官方解决是通过栈来解决的。栈,额哈哈,大学没有好好学数据结构,现在gg思密达了,回去补补过几天再说。
2022-5-11 补充
class Solution {
public boolean isValid(String s) {
Stack<Character> arrayStack = new Stack<>();
char[] chars = s.toCharArray();
for (char c : chars) {
switch (c) {
case '{':
case '[':
case '(':
arrayStack.push(c);
break;
case '}':
case ']':
case ')':
if (!arrayStack.isEmpty()){
char ch = arrayStack.pop().toString().toCharArray()[0];
if ((c == '}' && ch != '{' )||( c == ']' &&
ch != '[' )||( c == ')' && ch != '(')){
System.out.println("Error: " + ch + " 不匹配 " + c);
return false;
}
} else {
return false;
}
break;
default:
break;
}
}
if (arrayStack.isEmpty()){
return true;
}
return false;
}
}
使用的是栈的数据结构,这里很好的使用了先入后出的逻辑,完美的诠释了括号匹配的情况。