ccf 201709-3 JSON查询
解题思路:
首先,先逐行读入n行数据,因为数据中会经常出现 空格 或者是 换行,所以,我们遇到空格和换行就忽略,同时将转义字符进行处理,将n行数据存入一个一维数组中。由于“n ≤ 100,每行不超过 80 个字符。m ≤ 100,每个查询的长度不超过 80 个字符”,所以我们可以将一位数组的大小设置为100*80,我偷了个懒直接设置了一维数组 in[maxn * maxn]。
接着需要构造一个映射,即做一个 string->string 或者是 string->object 的映射。
首先考虑string->string的映射,可以使用map<string,string>。
string->object的映射也可以转换为string->string的映射,例如输入样例:
10 5
{
"firstName": "John",
"lastName": "Smith",
"address": {
"streetAddress": "2ndStreet",
"city": "NewYork",
"state": "NY"
},
"esc\aped": ""hello""
}
其中的address即为嵌套,我们可以将address键值对应的object中的string->string映射如下存储:
address.streetAddress -> 2ndStreet
address.city -> NewYork
address.state -> NY
这样直接查找address.city就可以找到NewYork。需要注意,遇到address之后的第一个左括号' { '应该先存入:
address -> OBJECT
多层嵌套怎么处理呢,我们可以将一个object看成一个递归结构,每次遇到左花括号"{"就调用处理object的函数,进行处理。
开始的时候,在main函数中调用
solve("",in+1);//处理第一层嵌套
含义是:当前key为空,去掉左边第一个花括号,进入第一层嵌套。solve的功能就是进行string->string的映射,在记录完key值之后,遇到左括号' { ',就继续调用solve进行处理。
详细如何进行string->string的映射就...看代码吧
1 #include<iostream> 2 #include<cstring> 3 #include<map> 4 using namespace std; 5 const int maxn = 100+5; 6 map<string,string> dic; 7 char in[maxn*maxn]; 8 9 int solve(char *key,char *a) 10 {//处理的字符串的长度 11 for(int i=0;i<strlen(a);i++) 12 { 13 char nowKey[maxn],value[maxn]; 14 int lenKey = strlen(key); 15 int k=0; 16 for(k=0;k<lenKey;k++) 17 nowKey[k] = key[k]; 18 nowKey[k] = '