题目
题目描述:
福尔摩斯从X星收到一份资料,全部是小写字母组成。
他的助手提供了另一份资料:许多长度为8的密码列表。
福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。
他的助手提供了另一份资料:许多长度为8的密码列表。
福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。
请你编写一个程序,从第一份资料中搜索可能隐藏密码的位置。要考虑密码的所有排列可能性。
输入:
输入第一行:一个字符串s,全部由小写字母组成,长度小于1024*1024
紧接着一行是一个整数n,表示以下有n行密码,1<=n<=1000
紧接着是n行字符串,都是小写字母组成,长度都为8
输出:
一个整数, 表示每行密码的所有排列在s中匹配次数的总和。
样例输入
aaaabbbbaabbcccc 2 aaaabbbb abcabccc
样例输出
4
思路
因为全部为小写字母,所以开一个长度为26的数组。
统计字串中各个字母出现的次数就Ok了,如果相等就符合,否者就不符合。
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
String s=scan.nextLine();
int n=scan.nextInt();
scan.nextLine();
int count=s.length();
int sum=0;
int string[][]=new int[count+1][26]; //开二维是为了一次计算出所有的可能情况
for(int i=0;i<=count-8;i++)
{
String str=s.substring(i,i+8); //截取字串
for(int j=0;j<8;j++) {
string[i][str.charAt(j)-'a']++; //统计次数
}
}
for(int k=0; k<n; k++)
{
int flag;
int b[]=new int[26];
String str=scan.nextLine();
for(int i=0; i<8; i++) {
b[str.charAt(i)-'a']+=1;
}
for(int i=0; i<=count-8; i++)
{
flag=1;
for(int j=0; j<26; j++)
{
if(string[i][j]!=b[j])
{
flag=0;
break;
}
}
if(flag==1)
sum++;
}
}
System.out.println(sum);
}
}