题目描述
给定一些字符串,请写一个算法,从中搜索出包含您输入的字符序列的那些字符串,按匹配度的高低排序输出。没有任何一个字符串匹配上,输出-1。
字符串源source 如下:
"AB",
"ABC",
"ACB",
"ABCD",
"ADBCF",
"ABDCF",
"ABDC",
"ABDFCG",
"ABDFGC",
"ABDEFG",
"GABCEFG"
若输入查找的有序字符序列为"ABC",则运算结果如下(请注意结果的排序规则)。
ABC (匹配 ABC)(完全匹配上,匹配度最大)
ABCD (匹配 ABC.)
ABDC (匹配 AB.C)
ABDCF (匹配 AB.C.)
ABDFCG (匹配 AB..C.)
ABDFGC (匹配 AB...C)
ADBCF (匹配 A.BC.)
GABCEFG(匹配 .ABC...)
看到这个题目我第一想法就是暴力匹配,因为简单粗暴嘛,先把所有的字符串全部匹配出来,然后再想办法进行排序
输入
您需要查找的字符串 |
样例输入
ABC |
输出
按匹配度高低排序输出查找到的结果。没有任何一个字符串匹配上,输出-1。 |
样例输出
ABC ABDC ABDCF ABDFCG ABDFGC ADBCF GABCEFG |
然后我考试时,只实现了暴力匹配,匹配后的字符串排序一时间没什么头绪
我去网上参考了下C++,想到了一种方式,用二进制来进行排序
ABC 111111111
ABCD 111011111
GABCEFG 011100011
匹配上就置1,没有匹配上就置0;
思路就是这样,上代码:
public class Test_搜索字符串 {
/* 请完成下面这个函数,实现题目要求的功能 */
/* 当然,你也可以不按照下面这个模板来作答,完全按照自己的想法来 ^-^ */
/****************************** 开始写代码 ******************************/
static String[] doFilter(String[] source, String filter) {
// 输入字符串转字符数组
char[] charArr = filter.toCharArray(); // 注意返回值是char数组
String[] result = null;
result = new String[source.length];
int[] B = new int[source.length];
int[] b = new int[source.length];
int num = 0;
for (int i = 0; i < source.length; i++) {
// 数据源字符串转字符数组
char[] charSource = source[i].toCharArray();
// 全部置1
for (int x = 0; x < 9; x++) {
b[x] = 1;
}
int m = 0;
int t = 0;
for (int j = 0; j < charSource.length; j++) {
if (j >= charArr.length) {
j = charArr.length - 1;
}
if (m >= charSource.length) {
break;
}
for (; m < charSource.length; m++) {
if (charSource[m] == charArr[j]) {
t = t + 1;
b[m] = 1;
m = m + 1;
break;
}
if (charSource[m] != charArr[j]) {
b[m] = 0;
}
}
}
if (t == charArr.length) {
result[num] = source[i];
B[num] = Num(b);// b[i];
num++;
}
}
String T = null;
int tt = 0;
for (int result_i = 0; result_i < result.length; result_i++) {
for (int result_j = result_i + 1; result_j < result.length; result_j++) {
if (B[result_j] > B[result_i]) {
T = result[result_j];
result[result_j] = result[result_i];
result[result_i] = T;
tt = B[result_j];
B[result_j] = B[result_i];
B[result_i] = tt;
}
}
}
return result;
}
/****************************** 结束写代码 ******************************/
public static int Num(int[] b) {
int byteb = 0;
int num = 0;
for (int y = 0; y < 9; y++) {
byteb = (int) (b[y] * Math.pow(10, 8 - y));
num += byteb;
}
return num;
}
public static void main(String[] args) {
String[] _source = { "AB", "ABC", "ACB", "ABCD", "ADBCF", "ABDCF", "ABDC", "ABDFCG", "ABDFGC", "ABDEFG",
"GABCEFG" };
Scanner in = new Scanner(System.in);
String _filter;
try {
_filter = in.nextLine();
} catch (Exception e) {
_filter = null;
}
String[] res = doFilter(_source, _filter);
for (int res_i = 0; res_i < res.length; res_i++) {
if ((res[0] == null) && (res[res.length - 1] == null)) {
System.out.println("-1");
break;
}
if (res[res_i] == null)
break;
System.out.println(String.valueOf(res[res_i]));
}
}
}