20. 有效的括号(C++/C)---栈、哈希表解题

题目详情

给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。


注意空字符串可被认为是有效字符串。
 

示例 1:

输入: "()"
输出: true


示例 2:

输入: "()[]{}"
输出: true


示例 3:

输入: "(]"
输出: false


示例 4:

输入: "([)]"
输出: false


示例 5:

输入: "{[]}"
输出: true

 

——题目难度:简单


 





C++栈、哈希表解题代码(有注释)

class Solution {
public:
    bool isValid(string s) {
        unordered_map<char, int> mp{{'(', 1}, {'[', 2}, {'{', 3},
        						    {')', 4}, {']', 5}, {'}', 6}};
        stack<char> st;
        bool istrue = true; //注意空字符串可被认为是有效字符串
        for(char c : s) {
        	int temp = mp[c];
        	if (temp >= 1 && temp <= 3) st.push(c); //当出现左括号时,将其加入栈中
			else if (!st.empty() && mp[st.top()] == temp - 3) st.pop(); //当出现右括号时,一定要和栈顶字符相匹配,匹配后则移除栈顶元素 
			else { istrue = false; break; } //出现右括号时,不和栈顶字符相匹配,则说明该字符串无效
		}
		
		if (!st.empty()) istrue = false; //如果栈不为空,则说明还有剩余的左括号没有被匹配 
		
		return istrue;
    }
};

 

 

 





C语言解题代码

bool isValid(char * s){
    int geshu=0,i,count=0,key=1;  //key来防止像全是"))))"这些情况
    for( ;s[geshu]!='\0';geshu++);

    if(geshu==0)        //处理空字符串
    return true;    

    char *cp = (char *)malloc(sizeof(char)*(geshu+1));  //开辟足够空间    特殊情况,如"["而下面要用到cp[1],所以得+1
    memset(cp,0,geshu+1);
    for(i=0;i<geshu;i++)
    {
        if((s[i]=='(')||(s[i]=='{')||(s[i]=='[')){
            count++;
            cp[count]=s[i];
            key=0;
        }else if((s[i]==cp[count]+1)||(s[i]==cp[count]+2))
        {
            count--;
        }else      //这里相当于在没有出现 '('或者'['或者'{' 的情况下,出现了没有与前面相对应的 ')'或者']'或者'}'  ,那这肯定false的.  
        return false;   
    }
    free(cp);
    if( (count)||(key) ){
        return false;
    }

    return true;
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

重剑DS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值