蓝桥杯决赛----密文搜索

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

标题:密文搜索

福尔摩斯从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,否则按无效代码处理。

package 蓝桥杯;

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

public class 密文搜索 {

      /***
       * 分析:我们可以采取的思路就是拿到一个字符串进行排序比较
       * 首先我们对密文排序后,保存到list集合中,这样我们每读取八位,对其进行排序,到集合中查询即可
       */
    /*
    aaaabbbbaabbcccc
    2
    aaaabbbb
    abcabccc*/
    private static ArrayList<String> password = new ArrayList<String>();
    private static int count;
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String secret = input.nextLine();
        int n = Integer.parseInt(input.nextLine());
        for(int i=0;i<n;i++){
        String str = input.nextLine();
        char[] line = str.toCharArray();
        Arrays.sort(line);
        password.add(String.valueOf(line));
        }
        f(secret);
        System.out.println(count);
    }
    private static void f(String secret) {
        int i = 0;
        while(true){
        String substr = secret.substring(i,i+8);
        System.out.println(substr);
        char[] str = substr.toCharArray();
        Arrays.sort(str);
        substr = String.valueOf(str);
        if(password.contains(substr)){
            count++;
        }
        i++;
        if(i+8>secret.length()){
            break;
        }
        }

    }

}
阅读更多
换一批

没有更多推荐了,返回首页