Java实现字符串组合的模糊匹配

  • 背景
  • 实现方式
  • 后续优化


背景

接到这么一个需求:根据用户输入内容(以下简称S)对一系列的字符串组合(每个字符串组合以下简称Z)进行模糊匹配,返回匹配的字符串组合(以下简称R)。
举个例子,有如下一系列的Z:(ab),(ab,cd),(ab,cd,ef)
当S为a时,R为(ab),(ab,cd),(ab,cd,ef)
当S为a,c时,R为(ab,cd),(ab,cd,ef)

实现方式

如果要做精确匹配,实际上就是判断S是不是Z的子集,可以直接考虑调用List.containsAll实现。
模糊匹配,实际上是对S中的每个字符串s,判断Z中是否有一个字符串z包含它,即z.contains(s)。

核心代码如下:

import java.util.*;

public class FuzzyContainsTest {
    public static void main(String []args) {
        List<String> list = Arrays.asList("ab,cd".split(","));
		List<String> query = Arrays.asList("a,c".split(","));
		System.out.println(fuzzyContainsAll(list, query));
    }
	
	// 判断S是不是Z的子集
	public static boolean fuzzyContainsAll(List<String> list, List<String> query) {
		boolean flag = true;
		for(String str : query) {
			flag = flag && fuzzyContains(list, str);
		}
		return flag;
	}
	
	// 对S中的每个字符串s,判断Z中是否有一个字符串z包含它
	public static boolean fuzzyContains(List<String> list, String s) {
		boolean flag = false;
		for(String z : list) {
			flag = flag || z.contains(s);
		}
		return flag;
	}
}

后续优化

这段代码的时间复杂度是O(n^3),应该有优化的空间,或者有更高效的实现方式,后续想到了再补充。