洛谷P1241 括号序列 (无栈)

题面:

 输入:

输出:

基本测试用例:

思路:

 这道题是真的恶心啊,因为本蒟蒻脑子不太好,从32分一路改改改,改到100,期间参考过题解,也尝试过使用栈进行解题,奈何还是错露摆出,最后只能回归最开始做的思路,放弃栈,改用数组进行标记进行解题

这道题的难点之一是题目意思是真的难懂,语文水平太过低下,从题面来看,其实对于一个字符串从左到右历遍,出现右括号的,则需要找到此括号的左边最近的相对应的括号(原对原,中对中),找到了则两者配对,如果找不到则配对失败。然后在我们输出字符串时,需要对未匹配的括号进行补全(缺左补左,缺右补右),已配对的则直接输出就行。

那么现在看来是不是题目很简单呢,在理清题目后就可以着手进行写出代码,我们可以沿用我们对题目理解出来的思路,即历遍字符串,如遇到右括号则向左寻找对应的左括号,找到了则用一个bool类型数组记录,表示已经匹配了括号,然后同理一直历遍到字符串末尾,然后再历遍一次,根据bool数组里面提供的匹配信息知道该如何输出。

代码如下

#include<iostream>
#include<string>
#include<string.h>
using namespace std;
bool b[101];
int main()
{
	memset(b,false,sizeof(b));
	string str;
	cin>>str;//输入字符串
	for(int i=0;i<str.length();i++)//开始第一次历遍
	{
        //对字符串内容进行匹配
        //分两种情况,一种是遇见')'另一种是']'
		if(str[i]==')')
		{
			for(int j=i;j>=0;j--)
			{
                //这个&&后面的条件是为了防止重复对着一个相同的字符匹配
				if(str[j]=='('&&b[j]==false)
				{
					b[i]=b[j]=true;
					break;
				}
				else
				if(str[j]=='['&&b[j]==false)
				{
					break;
				}
			}
		}
		else
		if(str[i]==']')
		{
			for(int j=i;j>=0;j--)
			{
				if(str[j]=='['&&b[j]==false)
				{
					b[i]=b[j]=true;
					break;
				}
				else
				if(str[j]=='('&&b[j]==false)
				{
					break;
				}
			}
		}
	}
	for(int i=0;i<str.length();i++)//第二次历遍
	{
		if(b[i]==true)//当为真时,说明此字符已经被匹配
		{
            //输出原字符就行
			cout<<str[i];
		}else 
		{
            //当为假时,说明没被匹配,然后根据是什么括号进行输出就行
			if(str[i]=='('||str[i]==')')
			cout<<"()";
			else
			cout<<"[]";
		}
	}
	return 0;
}

好了,这题到这里就结束了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值