A: 对dfs和回溯的应用场景还是不太了解, 抬手一个回溯...wa了好几发 然后改成dfs过了
看了讲解, dfs可能会栈溢出,可以用状态压缩来避免
DFS写法:

    long maxG =-1;
    int VV=0;
    int[] gg = null;
    public int Maximumweight (int[] v, int[] g, int V) {
        // write code here
        VV= V;
        gg=g;

        dfs(v,0,0,0);
        return (int)maxG;

    }

    public void dfs(int[] v, int pos,long cur,long weight){

        if(cur > VV){
            return;
        }else if(cur == VV){
            maxG = Math.max(maxG,weight);
            return;
        }
        if(pos >=v.length){
            return;
        }
        //不要
        dfs(v,pos+1,cur,weight);
        //要
        dfs(v,pos+1,cur+v[pos],weight+gg[pos]);
    }

状态压缩写法:

    public int Maximumweight (int[] v, int[] g, int V) {
        // write code here
        int n =  v.length;
        int res =-1;
        for(int i=0; i< 1<<n;++i){
            int sumG =0;
            int sumV=0;
            int k=i;

            int j=0;
            while(k>0){
                if((k&1)==1){
                    sumV += v[j];
                    sumG += g[j];
                }
                k = k>>1;
                j++;
            }
            if(sumV ==V){
                res = Math.max(res,sumG);
            }
        }
        return res;
    }

B: kmp的next, 让字符串长度+1,返回next数组最后一位的值就行

    public int solve (String s) {
        int[] next = getNextArray((s+"#").toCharArray());
        return next[next.length-1]==0 ? -1:next[next.length-1];
    }
    public static int[] getNextArray(char[] str){
        if (str.length == 1) {
            return new int[]{-1};
        }
        int[] next  = new int[str.length];
        next[0]=-1;
        next[1]=0;

        int cur=2;
        int x=next[cur-1];
        while(cur<str.length){
            if(x==-1 || str[x] == str[cur-1] ){
                next[cur++]=++x;
            }else{
                x=next[x];
            }
        }

        return next;
    }

C: 我不配