CCF JSON查询 201709-3

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/L1558198727/article/details/88976489

提交80分 可以做到层次查询,但是无法解决键值对的字符串里面出现{ } ,的情况,无解难受
去掉原字符串的空格 转义的第一个\ 回车 拼接成一个字符串 然后进行查找 遇到层次查找的时候就递归一下

#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>
#include <map>
#include <stack>
using namespace std;
#define debug(x) cout<<#x<<": "<<x<<endl;

vector<string> split(string s,char sp){
    vector<string> ret;
    for(int i=0;i<s.size();){
        int j=i;
        j = s.find(sp,j);
        if(j==i){
            i++;
        }else if(j>i){
            ret.push_back(s.substr(i,j-i));
            i=j+1;
        }else{

            ret.push_back(s.substr(i,s.size()-i));
            break;
        }
    }
    return ret;
}

string query(string s,string t,int cen){
    string ret="";
    s.pop_back();
    s=s.substr(1);
    vector<string> tt = split(t,'.');
    //debug(cen);
    //debug(tt.size());
    string nextfind = '\"' + tt[cen] + '\"'+':';
    //debug(nextfind);
    int start = s.find(nextfind);
    if(start<0){
        return "NOTEXIST";
    }

    int mao = s.find(":",start);
    if(s[mao+1] == '"'){
        int dou = s.find("\"," ,mao);

        string tempstr = s.substr( mao+1, dou-mao);
        tempstr.pop_back();
        tempstr = tempstr.substr(1);
        return "STRING " + tempstr;
    }else if(s[mao+1] == '{'){
        if( cen == tt.size()-1){
            return "OBJECT";
        }
        int xias = mao+1;
        int cnt = 0;

        int k = s.find("},",xias);
        string xiass = s.substr(xias,k-mao);
        //debug(xiass);
        //xiass = '\"' + xiass + '\"'+':';
        return query(xiass,t,cen+1);
        //query(s)
    }

    return ret;
}

int main()
{

    char c;
    int n,m;
    string s="";

    scanf("%d%d",&n,&m);
    n++;
    char pre;
    while( n ){

        c = getchar();
        if(c=='\n'){
            n--;
        }else{
            if(c == ' ' ){
             ;
            }else if(c=='\\'){
                if(pre=='\\')
                    s += c;
            }else{
                s += c;
            }

        }
        pre = c;
    }
    //cout<<s<<endl;
    for(int i=0;i<m;i++){
       string sin;
       cin>>sin;
       cout<<query(s,sin,0)<<endl;
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/L1558198727/article/details/88976489
今日推荐