福尔摩斯从X星收到一份资料,全部是小写字母组成。
他的助手提供了另一份资料:许多长度为8的密码列表。
福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。
请你编写一个程序,从第一份资料中搜索可能隐藏密码的位置。要考虑密码的所有排列可能性。
数据格式:
输入第一行:一个字符串s,全部由小写字母组成,长度小于1024*1024
紧接着一行是一个整数n,表示以下有n行密码,1<=n<=1000
紧接着是n行字符串,都是小写字母组成,长度都为8
要求输出:
一个整数, 表示每行密码的所有排列在s中匹配次数的总和。
例如:
用户输入:
aaaabbbbaabbcccc
2
aaaabbbb
abcabccc
则程序应该输出:
4
思路:将输入的8个一段的密码字符串进行排序后存储。 对资料字符串,逐个遍历,每次向后取8位后,也是排序,跟密码字符串进行比对
package bluecuppractice;
import java.util.Arrays;
import java.util.Scanner;
/**
* @author Susuper
* @version 1.0
* @date 2019/11/28 13:51
* @description
*/
public class TE1128 {
//对 aaaabbbb 存在有 aaaabbbb、aaabbbba、aabbbbaa 对abcabccc有aabbccc 共四种
static int count = 0;
static int n;
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
String str = sc.nextLine();
n =sc.nextInt();
String[] strs = new String[1010];
sc.nextLine(); //读取换行
for(int i = 0;i<n;i++){
String temp = sc.nextLine();
char[] chars = temp.toCharArray(); //先转化为字符串 然后在排序后转换会来string
Arrays.sort(chars);
strs[i] = new String(chars);
}
//完成输入存储
for(int i = 0;i<=str.length()-8;i++){
String temp = str.substring(i,i+8);
char[] chars = temp.toCharArray(); //先转化为字符串 然后在排序后转换会来string
Arrays.sort(chars);
temp = new String(chars);
for(int j = 0;j<n;j++){
if(temp.equals(strs[j]))
count++;
}
}
System.out.println(count);
//判断结果
}
}