背景
接到这么一个需求:根据用户输入内容(以下简称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),应该有优化的空间,或者有更高效的实现方式,后续想到了再补充。