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

来源:互联网 发布:淘宝交保证金可以退吗 编辑:程序博客网 时间:2024/04/28 01:03

题目要求:对形如"(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;}


原创粉丝点击