问题标题: 酷町堂:1750 方括号的配对 最近怎么总是挂在这种简单题目上???

0
0
已解决
王子健
王子健
初级天翼
初级天翼

1750   方括号的配对    经验值:1200

题目描述 Description

给定一个序列,里面只包含左方括号和右方括号,请按照右方括号出现的次序从左到右的顺序输出每一对配对的方括号出现的位置编号。
(注:括号序列从0开始编号)

输入描述 Input Description

一行:一个只包含左方括号和右方括号的合法方括号序列

输出描述 Output Description

设方括号序列中有 n 个右方括号,则输出 n 行:
每行两个整数 l r,分别表示配对的方括号的左括号出现在第 l 位,右括号出现在第 r 位。

样例输入 Sample Input

[[]][]

样例输出 Sample Output

1 2

0 3

4 5

数据范围及提示 Data Size & Hint

序列总长度不超过100

 

30分RE代码:

#include <stack>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
stack<int> s;
string s1;
int main(){
    cin >> s1;
    for (int i=0; i<s1.size(); i++){
        if(s1[i] == '[') s.push(i);
        else {
            cout << s.top() << ' ' << i << endl;
            s.pop();
        }
    }
    return 0;
}

 


0
已采纳
黄子扬
黄子扬
初级天翼
初级天翼

思路和你一样,也挂了

黄子扬在2020-08-25 09:28:04追加了内容

和你不一样的思路,也挂了,70分,WA #378

#include<bits/stdc++.h>
using namespace std;
struct str
{
    char s;
	int num;	
}a[10005];
int f,cnt,c[10005];
int main()
{
	while(cin>>a[++f].s)
	{
	    a[f].num=f;
	    if(a[f].s==']')
	        c[++cnt]=f;
	}
	f--;
	for(int i=1;i<=f/2;i++)
	{
		for(int j=c[i]-1;j>=1;j--)
		    if(a[j].s=='[')
		    {
		        cout<<a[j].num-1<<" "<<c[i]-1<<endl;
		        a[j].s=' ';
		        break;
		    }
	}
	return 0;
}

直接模拟的

黄子扬在2020-08-25 09:28:32追加了内容

从离右括号最近的左括号开始找的

黄子扬在2020-08-25 11:20:06追加了内容

wa

黄子扬在2020-08-26 09:35:24追加了内容
#include <stack>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
stack<int> s;
string s1;
int main(){
    cin >> s1;
    for (int i=0; i<s1.size(); i++){
        if(s1[i] == '[') s.push(i);
        else if(!s.empty()){
            cout << s.top() << ' ' << i << endl;
            s.pop();
        }
    }
    return 0;
}

zyf大佬说的没错,判断一下非空就可以ac了

黄子扬在2020-08-26 09:35:28追加了内容
#include <stack>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
stack<int> s;
string s1;
int main(){
    cin >> s1;
    for (int i=0; i<s1.size(); i++){
        if(s1[i] == '[') s.push(i);
        else if(!s.empty()){
            cout << s.top() << ' ' << i << endl;
            s.pop();
        }
    }
    return 0;
}

zyf大佬说的没错,判断一下非空就可以ac了

0
刘乐宸
刘乐宸
新手天翼
新手天翼
if(a[i]=='@') break;
        else if(a[i]=='【'){
            s.push(a[i]); 
        }
        else if(a[i]=='】'){
                if(s.empty()){
                cout<<"NO";
                return 0;
            }
                else s.pop();
            }

用栈做

0
赵逸凡
赵逸凡
初级启示者
初级启示者

肯定RE啊,你pop的次数可能比push多

赵逸凡在2020-08-25 10:40:19追加了内容

@王子健 废话个horse,你知道pop可能比push多不就加个判断搞定吗?感觉你栈没学好

0
胡钰妍
胡钰妍
资深光能
资深光能

使用栈操作解决该题目。栈中存储元素为一个数,表示这个元素在原字符串中的位置。

如果遇到左括号就将其位置进栈,否则判断栈是否为空,如果不为空则取出栈顶元素并将其和当前位置一起输出。

望采纳

我要回答