Java 匹配字符串并按匹配度高低排序输出


题目描述

给定一些字符串,请写一个算法,从中搜索出包含您输入的字符序列的那些字符串,按匹配度的高低排序输出。没有任何一个字符串匹配上,输出-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 
ABCD 

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]));
		}

	}
}


  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值