1.解题思路
首先对字符串进行连接和去空格处理,由于存在两种类型:字符串和对象,逐个扫描字符串,找到双引号,通过判断后续字符是双引号还是左括号来判断是字符串还是对象,对于字符串,直接取相应的键和值即可,对于对象,进行括号匹配,将整个对象作为参数进行递归。
2.满分代码
#include<bits/stdc++.h>
using namespace std;
map<string,string>mp;//名称--类型
void deal(string &str)//对字符串去\操作
{
for(string::iterator it=str.begin();it!=str.end();it++)
{
if(*it=='\\')
it=str.erase(it);
}
}
int n,m;
void solve(string &json,string &add)
{
string key,val;
for(int i=0;i<json.size();i++)
{
if(json[i]=='"')
{
int j=json.find(':',i);
key=json.substr(i+1,j-2-i);
if(add!="")//属于对象嵌套内的键值
key=add+"."+key;
if(json[j+1]=='"')//字符串类型
{
if(json.find(',',j+1)!=-1)
{
i=json.find(',',j+1);
}
else
i=json.size()-1;
val=json.substr(j+2,i-3-j);
deal(val);
deal(key);
}
else//对象类型
{
int cnt=1;
i=j+2;
while(cnt)
{
if(json[i]=='{')
cnt++;
if(json[i]=='}')
cnt--;
i++;
}
val=json.substr(j+1,i-j-1);
solve(val,key);
}
mp.insert(make_pair(key,val));
}
}
}
int main()
{
string str="";
string tmp;
cin>>n>>m;
cin.ignore();
for(int i=1;i<=n;i++)//去空格 连接
{
getline(cin,tmp);
for(string::iterator it=tmp.begin();it!=tmp.end();)
{
if(*it==' ')
it=tmp.erase(it);
else
it++;
}
str=str+tmp;
}
tmp="";
solve(str,tmp);
while(m--)
{
cin>>tmp;
if(mp.find(tmp)==mp.end())
{
cout<<"NOTEXIST"<<endl;
}
else
{
if(mp[tmp][0]=='{')
{
cout<<"OBJECT"<<endl;
}
else
{
cout<<"STRING "<<mp[tmp]<<endl;
}
}
}
return 0;
}