Given a string containing just the characters '('
, ')'
, '{'
, '}'
, '['
and ']'
, determine if the input string is valid.
An input string is valid if:
- Open brackets must be closed by the same type of brackets.
- Open brackets must be closed in the correct order.
Note that an empty string is also considered valid.
Example 1:
Input: "()"
Output: true
Example 2:
Input: "()[]{}"
Output: true
Example 3:
Input: "(]"
Output: false
Example 4:
Input: "([)]"
Output: false
Example 5:
Input: "{[]}"
Output: true
大概写写改改两三个小时,想用递归的方法但没有做出来。。
原本的思路是找pair,如果找不到就FALSE,如果找得到再判断位置,如果两个挨着就继续判断后面的,如果隔着就判断内部的。但是终止时候的判断条件不知道怎么写,刚好到了句末'\0'的还好,内部的该怎么判断应该停止了呢,该怎么把判断过的排除在外呢?
搜了一下答案,恍然大悟,原来这是应该使用栈的经典题型。。
参考:https://blog.csdn.net/runningtortoises/article/details/45621933,里面有多种语言的解法。
参考代码如下:
bool isValid(char* s) {
char stack[1000000];//创建容量1000000的char型栈,这个大小没有不被允许,堆是由malloc分配的内存
int top=-1;//初始化栈空间,表明栈当前为空
while(*s){//对字符串从首地址开始遍历,字符串完全结束时为空,*s==''为空字符串时,*s值为0假,不进入while循环。
if(*s==')'){
if(top>=0 && stack[top]=='(')top--;
else return false;
//当出现后括号时,top指向最近一次进栈的值,判断与这个后括号是否成对,如果成对的话,让top--,相当于最近一次进栈的值的被出栈了,再有进栈的会覆盖它;
//注意top不能为-1,如果第一个出现的是后括号也会先让它进栈,stack[0]会一直是那个后括号出不去,肯定会false。
}else if(*s=='}'){
if(top>=0 && stack[top]=='{')top--;
else return false;
}else if(*s==']'){
if(top>=0 && stack[top]=='[')top--;
else return false;
}
else stack[++top]=*s;//最开始时top==-1,top增1且让第一个字符进栈,不管这个字符是后括号还是前括号
s++;
}
return top==-1;//当空字符串的时候,没有while肯定-1,当不能完全成对弹出栈的时候都一定不是-1
}
关于堆和栈的区别,看https://blog.csdn.net/x_chengqq/article/details/51190678,经典示例如下:
int a = 0; //a在全局已初始化数据区
char *p1; //p1在BSS区(未初始化全局变量)
void main()
{
int b; //b在栈区
char s[] = "abc"; //s为数组变量,存储在栈区,“abc”为字符串常量,存储在已初始化数据区
char *p1, p2; //p1、p2在栈区 这里我觉得p2不是指针类型,下面直接malloc有问题,用dev C显示不是指针,VC编译器下也不是指针类型
char *p3 = "123456"; //123456\0在已初始化数据区,p3在栈区
static int c = 0; //c为全局(静态)数据,存在于已初始化数据区
//另外,静态数据会自动初始化
p1 = (char *)malloc(10); //分配得来的10个字节的区域在堆区
p2 = (char *)malloc(20); //分配得来的20个字节的区域在堆区
free(p1);
free(p2); }
Java版本与c版本思路一致,只是表达上有所区别。
public class Solution {
public boolean isValid(String s) {
int length=s.length(),top=-1,i=0;
char[] stack=new char[length];//创建与原字符串长度一致的char型数组,作为栈
char[] str=s.toCharArray();//toCharArray()方法将字符串转换为字符数组,不用管具体长度
while(i<length){
if(str[i]==')'){
if(top>=0 && stack[top]=='(')top--;
else return false;
}else if(str[i]=='}'){
if(top>=0 && stack[top]=='{')top--;
else return false;
}else if(str[i]==']'){
if(top>=0 && stack[top]=='[')top--;//如果进来是后括号,如果匹配则把前括号弹出,如果不匹配则return false
else return false;
}else stack[++top]=str[i];//如果进来的是前括号,则直接进栈
i++;
}
return top==-1;//返回的是一个布尔型的数值,如果top==-1成立,则说明都被弹出,如果不成立,则说明有不被匹配的项。
}
}