有效的括号
说明
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104s仅由括号'()[]{}'组成
来源:力扣(LeetCode) 链接:leetcode.cn/problems/va…
题解
解法一(8ms)
我自己的解法思想是:
-
先把s字符串分解为一个数组
-
然后创建一个 字符串str来作为 “栈”使用
-
通过每次循环把每个字符保存在str中
-
在每个保存的时候进行判断 如果 本次保存的是上一个字符所对应的符号就抵消掉 然后继续循环下去,知道结束
-
当结束后str(栈)中还存在字符串就所以这个字符串中括号的位置是错误的
-
例1:
- ( [ ) ]
- 第一次:str = ( 然后循环进来 [ ,因为(对应的符号不是[ 所以继续拼接
- 第二次: str = ( [ 循环进来 ),因为 [ 对应的符号不是) 所以继续拼接
- .....
- 最后str = ( [ ) ] ,最后判断 str不为“”,那么这个字符串不合法 返回false;
-
例2
- ()[]{}
- 第一次:str = ( 然后循环进来 ),( 对应的符号是 ) 所以把这两个符号都从str中去掉 str = "" ,然后把后面的字符放在str中
- 第二次: str = [ ,循环进来 ] ,因为也是对应的 同上 str = "",然后把后面的字符放进来 str = {
- 第三次同上
- 最后str = "" ,说明这个字符串是合法的 返回true
-
就像消消乐一样
public static void main(String[] args) {
//给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
//有效字符串需满足:
//左括号必须用相同类型的右括号闭合。
//左括号必须以正确的顺序闭合。
String s = "([)]";
String s1 = "()[]{}";
System.out.println(demo(s));
System.out.println(demo(s1));
}
public static boolean demo(String s){
String[] split = s.split("");
if(split.length % 2 != 0){
return false;
}
HashMap<String, String> map = new HashMap<>();
map.put(")","(");
map.put("]","[");
map.put("}","{");
StringBuilder str = new StringBuilder(split[0]);
for (int i = 1; i < split.length; i++) {
String substring = str.substring(str.length() - 1, str.length());
String s1 = map.get(split[i]);
if(substring.equals(s1)){
if(0 != str.length() - 1){
str = new StringBuilder(str.substring(0, str.length() - 1));
}else{
if(i + 1 < split.length){
str = new StringBuilder(split[i + 1]);
i++;
}else{
str = new StringBuilder();
}
}
}else{
str.append(split[i]);
}
}
return "".equals(str.toString());
}
解法二 32ms(解法一的简写,只不过效率没有解法一快)
public static void main(String[] args) {
//给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
//有效字符串需满足:
//左括号必须用相同类型的右括号闭合。
//左括号必须以正确的顺序闭合。
String s = "([)]";
String s1 = "()[]{}";
System.out.println(demo(s));
System.out.println(demo(s1));
}
public static boolean demo(String s){
int num = 1;
while (num != 0){
int length = s.length();
s = s.replace("()","");
s = s.replace("{}","");
s = s.replace("[]","");
if(length == s.length()){
num = 0;
}
}
return "".equals(s);
}
解法三 1ms(力扣大佬写的,简单又快捷)
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()||c!=stack.pop())return false;
}
return stack.isEmpty();