这是一个又臭又长的字符串模拟问题
可以将该题分解为这几步
-
将第一行的字符串统计为带参数和不带参数的 参数
例如albw:x中,a是不带参的,w是带参的。我使用两个数组进行存储,c数组记录参数名字,b数组该参数是否带参 -
将输入的一个字符串分割为字符串数组,为了方便处理
-
判断字符串数组种类
3.1 开头是abc,直接跳出循环
3.2 开头是-a,将a标记表示已经出现过
3.3 开头是-w,因为w是带参数的,如果w没有被标记则标记w并将i+1个数组作为参数放入数组中去。如果w被标记了则更新参数.
C++ 代码
#include <iostream>
#include <map>
#include <utility>
using namespace std;
char c[60];
bool b[60];
string s[100];
int len;
int tail = 0;
map<string,string> mm;
int check(char a){
for(int i = 0; i < tail; i++){
if(a == c[i] && b[i] == 0) return 0;
if(a == c[i] && b[i] == 1) return 1;
}
return -1;
}
int main(){
string cmd;
cin >> cmd;
// 预处理
len = cmd.length();
for(int i = 0; i < len; i++){
if(cmd[i] != ':' && i + 1 < len && cmd[i+1] == ':'){
c[tail] = cmd[i];
b[tail++] = 1;
}else if(cmd[i] != ':'){
c[tail++] = cmd[i];
}
}
int n;
string s1;
cin >> n;
getchar();
for(int ll = 1; ll <= n; ll++){
getline(cin,s1);
// 切割字符串
int tail2 = 0;
string s2 = "";
len = s1.length();
for(int i = 0; i < len; i++){
if(s1[i] != ' ') s2+=s1[i];
else{
s[tail2++] = s2;
s2 = "";
}
}
s[tail2++] = s2;
// 分情况讨论
for(int i = 1; i < tail2; i++){
if(s[i][0] != '-') break;
int res = check(s[i][1]);
if(res == -1) break;
if(res == 0){
mm[s[i]] = "";
}
if(res == 1){
if(i + 1 >= tail2) break;
//cout << "===" << endl;
//cout << s[i + 1] ;
mm[s[i]] = s[i+1];
i++;
}
}
// 输出结果
cout << "Case " << ll << ": ";
for(auto x: mm){
cout << x.first;
if(x.second == "") cout << " ";
else cout << " " << x.second << " ";
}
cout << endl;
mm.clear();
}
return 0;
}