1.题意:
* 20.有效的括号 valid Parentheses 括号匹配。 * 给定一个只包括" { ,},[ ],( ) "的字符串,判断字符串是否有效 * 括号必须以正确的顺序关闭,"( )" 和"{} ,(),[ ]" 是有效的但是 * " ([)] " 不是。
2.解题思路:
时间复杂度O(n) 空间复杂度O(n)
1.左括号压栈 ,遇到右括号 取出栈顶与右括号比较。是否相同。 最后栈为空。 栈顶元素反应的就是最近的需要匹配的元素,如果此时栈为空则不匹配。
3.代码1
import org.junit.Test;
import java.util.Stack;
/**
* 解题思路:
* 左括号压栈 ,遇到右括号 取出栈顶与右括号比较。是否相同。
* 最后栈为空。
* 栈顶元素反应的就是最近的需要匹配的元素。
*
*
*/
public class Solution20 {
@Test
public void test1(){
System.out.println(isValid("{([])}"));//true
System.out.println(isValid("{}}"));//false
System.out.println(isValid("(((({{{}}}))))"));// true
System.out.println(isValid("()()()()("));// 奇数个 false
}
@Test
public void test2(){
System.out.println(isValidByJavaSatck_2("{([])}"));//true
System.out.println(isValidByJavaSatck_2("{}}"));//false
System.out.println(isValidByJavaSatck_2("(((({{{}}}))))"));// true
System.out.println(isValidByJavaSatck_2("()()()()("));// 奇数个 false
}
public boolean isValid(String s){
// 1.合法性判断
if(s==null|| s.length()==0){
return false;
}
//2.如果字符串长度不为偶数--- 说明有一个多余的。
if(s.length()%2!=0){
return false;
}
IStack<Character> arrayStack =new ArrayStack<>();
//1. 遍历,如果是左括号压栈
for (int i = 0; i <s.length() ; i++) {
char ch =s.charAt(i);
if(ch=='{'||ch=='('||ch=='['){
arrayStack.push(ch);
}
if(ch=='}'|| ch==']'|| ch==')'){//如果是左括号 就出栈
if(arrayStack.isEmpty()){// 如果此时栈不为空说明不匹配
return false;
}
Character chget= arrayStack.pop();
if(( chget=='{'&& ch=='}' )|| ( chget=='[' && ch==']' ) || ( chget=='(' && ch==')' )) {
continue;
}else{
return false;
}
}
}
return true;//不能直接返回 true 应该要判断栈是否是否为空 return isEmpty
}
/***
* 使用 Stack
*
*
*
*/
public boolean isValidByJavaSatck(String s){
// 1.合法性判断
if(s==null|| s.length()==0){
return false;
}
//2.如果字符串长度不为偶数--- 说明有一个多余的。
if(s.length()%2!=0){
return false;
}
Stack <Character> stack =new Stack<>();
//1. 遍历,如果是左括号压栈
for (int i = 0; i <s.length() ; i++) {
char ch =s.charAt(i);
if(ch=='{'||ch=='('||ch=='['){
stack.push(ch);
}
if(ch=='}'|| ch==']'|| ch==')'){//如果是左括号 就出栈
if(stack.isEmpty()){// 如果此时栈不为空说明不匹配
return false;
}
Character chget= stack.pop();
if(( chget=='{'&& ch=='}' )|| ( chget=='[' && ch==']' ) || ( chget=='(' && ch==')' )) {
continue;
}else{
return false;
}
}
}
return true;
}
public boolean isValidByJavaSatck_2(String s){
// 1.合法性判断
if(s==null|| s.length()==0){
return false;
}
//2.如果字符串长度不为偶数--- 说明有一个多余的。
if(s.length()%2!=0){
return false;
}
Stack <Character> stack =new Stack<>();
//1. 遍历,如果是左括号压栈
for (int i = 0; i <s.length() ; i++) {
char ch =s.charAt(i);
if(ch=='{'||ch=='('||ch=='['){
stack.push(ch);
}else{
if(stack.isEmpty()){//栈为空
return false ;
}
Character chget= stack.pop();
if(( chget=='{'&& ch!='}' )|| ( chget=='[' && ch!=']' ) || ( chget=='(' && ch!=')' )) {
{
return false;
}
}
}
}
return stack.isEmpty();
}
}