文本相似性搜索算法

时间:2019-07-14 18:49:46

标签: java

说我有String x= "algorithm"和String y= "mgth"

字符串x包含字符串y中的所有字母,我可以将字符串y拆分为一个字母列表,然后遍历此列表以查看字符串x是否包含字母y[index], 但我想知道是否有更有效的方法

编辑:

在Kotlin中有一个简单的相交函数,例如:

val x="algorithm".toList()
val y="mgth".toList()
val interesct=x.intersect(y) //returns a Set of matching chars

if (y.size == interesct.size){
    println("match")
}

3 个答案:

答案 0 :(得分:1)

使用Set是一种更有效的方法。

String x = "algorithm";
String y = "mgth";
Set<Character> set = new HashSet<>();

for(char c: y.toCharArray())
   set.add(c);
for(char c: x.toCharArray())
   set.remove(c);

if(set.size() == 0) 
    System.out.println("X contains Y");
else 
    System.out.println("X does not contain Y");

以上代码的作用是将较小的String中的字符添加到集合中。然后,它删除较大的String中的每个字符。

如果Set中有任何剩余字符,则表示较小的String包含的字母不在较大的String中。

答案 1 :(得分:1)

用于救援的正则表达式:

    String pattern = "mgth".chars()
            .mapToObj(ch -> "(?=.*" + (char) ch + ")")
            .collect(Collectors.joining());

    // ".*(?=.*m)(?=.*g)(?=.*t)(?=.*h).*"
    boolean matches = Pattern.compile(".*"+pattern+".*")
            .matcher("algorithm")
            .matches();

    System.out.println(matches);

仅当"algorithm"包含目标字符串生成的模式中的所有字符时,此匹配。

编辑

此外,您可以对两个字符串进行排序,并且仅在[min("mgth"), max("mgth")]个char值的间隔中执行比较。

答案 2 :(得分:1)

尝试这个

@Test
public void similarity() {
  String x = "algorithm";
  String y = "mgth";
  final boolean ohYes =
      y.chars().filter(yc -> x.chars().anyMatch(xc -> yc == xc)).count() == y.length();
  Assert.assertTrue(ohYes);
}