java实现第六届蓝桥杯密文搜索

密文搜索

福尔摩斯从X星收到一份资料,全部是小写字母组成。
他的助手提供了另一份资料:许多长度为8的密码列表。
福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。

请你编写一个程序,从第一份资料中搜索可能隐藏密码的位置。要考虑密码的所有排列可能性。

数据格式:

输入第一行:一个字符串s,全部由小写字母组成,长度小于1024*1024
紧接着一行是一个整数n,表示以下有n行密码,1<=n<=1000
紧接着是n行字符串,都是小写字母组成,长度都为8

要求输出:
一个整数, 表示每行密码的所有排列在s中匹配次数的总和。

例如:
用户输入:
aaaabbbbaabbcccc
2
aaaabbbb
abcabccc

则程序应该输出:
4

这是因为:第一个密码匹配了3次,第二个密码匹配了1次,一共4次。

资源约定:
峰值内存消耗(含虚拟机) < 512M
CPU消耗 < 5000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    
    public void getResult(String A, String[] pwd) {
        int count = 0;
        ArrayList<Integer> list = new ArrayList<Integer>();
        int[] num = new int[pwd.length];
        for(int i = 0;i < pwd.length;i++) {
            int hash = pwd[i].hashCode();
            if(list.contains(hash)) {
                int j = list.indexOf(hash);
                num[j]++;
            } else {
                list.add(hash);
                num[list.size() - 1]++;
            }
        }
        for(int i = 0;i <= A.length() - 8;i++) {
            String s = A.substring(i, i + 8);
            char[] temp = s.toCharArray();
            Arrays.sort(temp);
            StringBuffer t = new StringBuffer("");
            for(int j = 0;j < 8;j++)
                t.append(temp[j]);
            s = t.toString();
            int hash = s.hashCode();
            if(list.contains(hash)) {
                int k = list.indexOf(hash);
                count = count + num[k];
            }
        }
        System.out.println(count);
    }
    
    public static void main(String[] args) {
        Main test = new Main();
        Scanner in = new Scanner(System.in);
        String A = in.next();
        int n = in.nextInt();
        String[] pwd = new String[n];
        for(int i = 0;i < n;i++) {
            char[] arrayP = in.next().toCharArray();
            Arrays.sort(arrayP);
            StringBuffer s = new StringBuffer("");
            for(int j = 0;j < arrayP.length;j++)
                s.append(arrayP[j]);
            pwd[i] = s.toString();
        }
        test.getResult(A, pwd);
    }
}
原文地址:https://www.cnblogs.com/a1439775520/p/12947448.html