括号配对问题

括号配对问题

https://www.nowcoder.com/practice/57260c08eaa44feababd05b328b897d7?tpId=98&tqId=32880&tPage=3&rp=3&ru=/ta/2019test&qru=/ta/2019test/question-ranking

题目难度:二星
考察点:栈

方法:字符串

1.分析:

这是一个经典的括号匹配问题,只不过需要入栈的元素由一个变成了两个,而且这个题的题意不是很明确,如果包含除了括号之外的字符也是可以的。我们可以采用如下的步骤进行判断:
0. 首先定义一个栈st,栈所包含的元素为字符。
1. 遍历输入的括号序列,如果是'('或者是'[',那么就进栈,即st.push(s[i]);
2. 如果当前遍历到')',那么首先判断栈是否为空,如果栈为空,那么匹配失败,否则判断栈顶元素是否为'(',如果当前栈顶元素不为'(',则匹配失败
3. 如果当前遍历到']',那么还是先判断栈是否为空,如果栈为空,那么匹配失败,否则判断栈顶元素是否为'[',如果当前栈顶元素不为'[',则匹配失败
4. 如果当前为其它字符,不进行操作
5. 若能顺利遍历完成,那么需要检查栈中是否还有剩余元素,如果有,则匹配失败;如果没有,则匹配成功。
举个例子:假设有一个字符串s = "ab[()]cd":
那么用指针i表示字符串遍历的下标, st表示栈中元素
当i=0时,s[i]='a',此时什么也不进行操作
当i=1时,s[i]='b',此时什么也不进行操作
当i=2时,s[i]='[',此时要将[进栈,即栈中现在有'['
当i=3时,s[i]=']',此时栈顶元素为'[',正好能够匹配,那么测试弹栈,所以栈为空
当i=4时,s[i]='(,此时要将(进栈,即栈中现在有'('
当i=5时,s[i]=')',此时栈顶元素为')',正好能够匹配,那么测试弹栈,所以栈为空
当i=6时,s[i]='c',此时什么也不进行操作
当i=7时,s[i]='d',此时什么也不进行操作
遍历结束,此时栈为空,所以S字符串匹配成功。

2.复杂度分析:


时间复杂度:O(n) 
空间复杂度:O(1)

3.代码: 

#include <bits/stdc++.h>
using namespace std;
bool check(string s) {
    int len = s.size();
    stack<char> st;
    for(int i=0; i<len; i++) {
        if(s[i]=='(' || s[i] == '[') st.push(s[i]);
        else if(s[i] == ')') {
            if(st.empty() || st.top()!='(') return 0;
            st.pop();
        }
        else if(s[i] == ']') {
            if(st.empty() || st.top()!='[') return 0;
            st.pop();
        }
    }
    return st.empty();
}
int main(){
    string s; cin>>s;
    stack<char> st;
    if(check(s)) cout<<"true"<<endl;
    else cout<<"false"<<endl;
    return 0;
}


全部评论

相关推荐

10-28 14:42
门头沟学院 Java
watermelon1124:因为嵌入式炸了
点赞 评论 收藏
分享
11-09 14:54
已编辑
华南农业大学 产品经理
大拿老师:这个简历,连手机号码和照片都没打码,那为什么关键要素求职职位就不写呢? 从上往下看,都没看出自己到底是产品经理的简历,还是电子硬件的简历? 这是一个大问题,当然,更大的问题是实习经历的描述是不对的 不要只是去写实习流程,陈平,怎么去开会?怎么去讨论? 面试问的是你的产品功能点,是怎么设计的?也就是要写项目的亮点,有什么功能?这个功能有什么难处?怎么去解决的? 实习流程大家都一样,没什么优势,也没有提问点,没有提问,你就不得分 另外,你要明确你投的是什么职位,如果投的是产品职位,你的项目经历写的全都是跟产品无关的,那你的简历就没用 你的面试官必然是一个资深的产品经理,他不会去问那些计算机类的编程项目 所以这种四不像的简历,在校招是大忌
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务