注意:主类的名字必须是:Main,否则按无效代码处理。
思路:全排列密码,然后在第一个字符串中查找即可。注意去重。
忘记了kmp算法怎么实现的~~只好用个改进前的~~
package 总决赛; import java.io.*; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.Scanner; public class 密文搜索 { static int num = 0; static boolean vis[]; static char[]y;//母串 static HashSet<String>hs = new HashSet<String>(); static boolean is_in(char []y,char[]a){//a是否在y里 int i=0; for(int x=0;x<a.length;x++){//改进前的kmp算法。。 if(i >= y.length) { return false; } if(y[i] == a[x]) { i++; } else{ i = i+1-x; x = -1; } } return true; } static void dfs(char []y,char[]c,char []a,int d){//全排c,全排后结果为a和y比较,y中有a,放进HashSet中 if(d == c.length){ //判断a是否在y中 if(is_in(y,a)) { num++; hs.add(String.valueOf(a)); } return; } for(int i=0;i<c.length;i++){ if(!vis[i]) { a[d++] = c[i]; vis[i] = true; dfs(y,c,a,d); vis[i] = false; d--; } // else continue; } } public static void main(String[] args) { // TODO Auto-generated method stub Scanner s = new Scanner(System.in); String m = s.next(); y = m.toCharArray();//母串 int n = s.nextInt();//有n行密码 String[]z = new String[n]; for(int i=0;i<n;i++) { z[i] = s.next(); } for(int i=0;i<n;i++){ char []c = z[i].toCharArray(); vis = new boolean[c.length]; for(int j=0;j<c.length;j++) { vis[j] = false; } dfs(y,c,new char[c.length],0); } System.out.println(hs.size()); } }