LeetCode20_Valid Parentheses

Given a string containing just the characters '('')''{''}''[' and ']', determine if the input string is valid.

An input string is valid if:

  1. Open brackets must be closed by the same type of brackets.
  2. 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成立,则说明都被弹出,如果不成立,则说明有不被匹配的项。
    }
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值