以ffff为例。
思路:从找到的人名的前一个开始,比如找ffff,则从前面的(开始,逆向遍历。
难点:括号和逗号的处理。从e前面的第一个逗号开始,一直到bbbb前面的(为止的部分,直接删除,因为这些和eeee是同级的。
所以可以推测出一个结论,从逗号开始,到前面的左括号的部分,可以直接删除。但是这么说不严谨,因为cccc之前也有左括号,但是注意,该括号和dddd之后的右括号是匹配的。
所以正确的说法是,从逗号开始,忽略掉中间的成对括号,到第一个(为止的部分,直接删除。
代码中,我设置了douNum变量,从左括号开始,遇见右括号,douNum++,遇见左括号,douNum--。这样就把中间的部分删除掉了。
#include<bits/stdc++.h>
using namespace std;
int findName(string str, string s) //找到人名,返回首字母的索引
{
int len = s.length();
for(int i=0; i<str.length(); i++)
if(i+len-1<str.length() && str.substr(i, len)==s)
return i;
return -1;
}
int main()
{
string str;
cin>>str;
string s;
while(cin>>s)
{
vector<string> out; //输出数组
out.push_back(s);
int left = findName(str, s); //找到名字,返回首字母索引
int douNum=0;
for(int i=left-1; i>=0 ;i--)
{
if(str[i]==',') // ,和)使douNum++, (使douNum--
{
douNum++;
while(douNum)
{
i--;
if(str[i]==')') douNum++;
else if(str[i]=='(') douNum--;
}
}
else if(isalpha(str[i])) //如果是字母
{
int end = i;
while(isalpha(str[i]))
i--;
i++;
int begin = i;
out.push_back(str.substr(begin, end-begin+1));
}
}
for(int i=out.size()-1; i>=0; i--)
{
cout<<out[i];
if(i!=0) cout<<">";
}
cout<<endl;
}
return 0;
}