百度面试题目--删除字符串中嵌套的括号

题目要求:对形如”(1,2, 3,(4,5,(6,5),8,4)),(2,3,(1,2),4,5)”的字符串进行处理,如果存在括号嵌套情况(….(…)…),将里面的括号删除。

处理思想:

设置count,用来记录当前待匹配删除的‘(’的个数,count初值设为-1,这样是为了保证不会把最外层的括号给删除掉,当然,初值设为0,然后修改判断也可,只是意义表达会不明确,你说呢?每次读到一个‘(’,count立刻+1,然后判断此时的‘(’是不是最外层的【count=0】,不是的话【count>0】就删除这个括号;每次读到’)’,则根据count值来判断当前的‘)’是不是最外层的【count>0,说明还有嵌套的‘(’需要匹配,所以当前的‘)’肯定不是最外围的】,则删除当前的右括号,count-1。

// DeleteRepeatBrackets.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <IOSTREAM>
#include <STRING>
#include <STACK>
using namespace std;

bool IsMatched(const string & pStr)
{
	if (pStr.empty())
	{
		return true;
	}
	stack<char> brackets;
	string::const_iterator iter;
	for (iter=pStr.begin();iter<pStr.end();iter++)
	{
		if (*iter=='(')
		{
			brackets.push(*iter);
		}
		else
		{
			if (*iter==')')
			{
				if (brackets.size()>0&&brackets.top()=='(')
				{
					brackets.pop();
				} 
				else
				{
					return false;
				}
			}
		}
	}
	if (brackets.size()==0)
	{
		return true;
	} 
	else
	{
		return false;
	}

}

void DeleteRepeatBrackets(string & pStr)
{
	if (pStr.empty())
	{
		return;
	}
	int count=-1;
	string::iterator iter;
	for(iter=pStr.begin();iter<pStr.end();iter++)
	{
		if (*iter=='(')
		{
			++count;
			if (count>0)
			{
				pStr.erase(iter);	
				iter--;//调用erase时,iter会自动指向下一个元素,必须手动-1,否则for里再+1会跳过下一个元素
			}
		}
		else{
			if (*iter==')')
			{	
				if (count>0)
				{
					pStr.erase(iter);
					iter--;
				}
				--count;
			}
		}
	}
}

int main(int argc, char* argv[])
{
	string str="(1,2, 3,(4,5,(6,5),8,4)),(2,3,(1,2),4,5)";
	if(IsMatched(str))
	{
		cout<<"括号匹配成功"<<endl;
		DeleteRepeatBrackets(str);
		cout<<str<<endl;
	}
	else
	{
		cout<<"括号不匹配"<<endl;
	}
	return 0;
}

    原文作者:待磨的咖啡豆
    原文地址: https://blog.csdn.net/icandoit116/article/details/14420941
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞