ccf认证 201809-3 元素选择器

这道题比赛的时候是拿了满分,用的c++,现在用java实现才得了90分, 头疼。。。(标签判断时需要忽略大小写,改正后满分)

思路:

用结构体储存每一个元素,那么应包含

  • 1、等级
  • 2、属性
  • 3、标签

元素选择的话拆分成字符串数组,因此对元素字符串数组的每一项进行匹配,匹配完了的话,即得到答案。
举个例子,假设元素选择器为 div p,那么应当在元素数组中先找到div,然后接着这个位置向下找,找到p。则完成一次查找,然后回溯,寻找下一个答案。(要注意的是答案不可以重复,因此用Set存)

代码:(写得比较乱)
import java.util.*;

class Node{
    int level;
    String div;
    String id;
}
public class Main{
    private static Scanner cin;
    public static List<Node> list = new ArrayList<>();
    public static Set<Integer> set = new LinkedHashSet<>();
    public static void main(String[] args) {
        cin = new Scanner(System.in);
        int n = cin.nextInt();
        int m = cin.nextInt();
        cin.nextLine();

        list.clear();
        for(int i=1;i<=n;i++){
            String tmp = cin.nextLine();
            //System.out.println("读入的是 " + tmp);
            Node node = new Node();
            int pos = 0;
            while (tmp.charAt(pos) == '.'){
                pos++;
            }
            node.level = pos;
            tmp = tmp.substring(pos);
            for(String item : tmp.split(" ")){
                if(item.charAt(0) == '#')
                    node.id = item;
                else node.div = item;
            }
            list.add(node);
        }

//        for(Node node : list){
//            System.out.println(node.level + "   " + node.div + "   " + node.id);
//        }

        while(m-->0){
            set.clear();
            String choose = cin.nextLine();
            String [] chooses = choose.split(" ");

            dfs(0,-1,0,chooses);
            System.out.print(set.size());
            for(Integer item : set){
                System.out.print(" "+item);
            }
            System.out.println();
        }
    }
    public static  void dfs(int idx,int fatherLevel ,int idc, String[] chooses){
       // System.out.println("我现在要寻找: "+ chooses[idc] + " 我在数组处于: "+ idx + " 在查找数组里处于: " + idc);

        if(idc == chooses.length){
            //System.out.println("get到的idx "+ idx);
            set.add(idx);
            return ;
        }
        // 找不到了,返回
        if(idx == list.size())
            return  ;
        for(int i = idx;i<list.size();i++){
            Node node = list.get(i);
            if(node.level <= fatherLevel)
                return  ;
            String choose = chooses[idc];
            //System.out.println("当前处理  " + choose);
            if( (node.div!=null && node.div .equalsIgnoreCase(choose)) ||(node.id!=null&& node.id.equals(choose)) ){
                //System.out.println("找到了一个 " + choose + "下一个处理: " + idc);
                 dfs(i+1,node.level,idc+1,chooses);

            }
        }

    }
}
/*
11 5
html
..head
....title
..body
....h1
....p #subtitle
....div #main
......h2
......p #one
......div
........p #two




*/

路过的大哥知道90分的原因请告知!!(标签判断时需要忽略大小写)

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值