首页 > 解决方案 > 模式的字符串匹配

问题描述

我有 2 串模式a.{var1}.{var2}b.{var1}.{var2}.

如果var1第一个字符串与var1第二个字符串相同,并且var2第一个字符串与第二个字符串相同,则两个字符串匹配var2

变量可以是任何顺序,例如a.{var1}.{var2}b.{var2}.{var1}

如何有效地匹配两个字符串?

示例 1:

String pattern1 = "1.{var1}";
String pattern2 = "2.{var1}";

//Match True = (1.111,2.111)
//Match False = (1.121,2.111)

示例 2:

String pattern1 = "1.{var1}.{var2}";
String pattern2 = "2.{var1}.{var2}";

//Match True = (1.11.22,2.11.22)
//Match False = (1.11.22,2.111.22)

示例 3:

String pattern1 = "1.{var1}.{var2}";
String pattern2 = "2.{var2}.{var1}";

//Match True = (1.22.11,2.11.22)
//Match False = (1.11.22,2.111.22)

那么匹配这两个字符串的最佳方法是什么?

我想匹配这两个字符串以查找它们是否与提到的模式相关。
将此问题扩展到字符串集合,即集合 A 字符串必须与集合 B 中的字符串匹配。最后必须形成满足该匹配算法的字符串对。匹配 Set A 到 Set B 中的所有字符串时,模式将保持不变。

标签: javastringalgorithmdata-structures

解决方案


这可能不是最有效的方法,但它确实为您提供了预期的输出。

01/05:在 Ole 在评论中指出错误后更新代码:

private boolean compareStr(String a, String b) {
    ArrayList<String> aList = new 
    ArrayList<String>(Arrays.asList(a.split("\\.")));
    ArrayList<String> bList = new ArrayList<String>(Arrays.asList(b.split("\\.")));
    bList.remove(0);
    aList.remove(0);

    if(aList.size() != bList.size())
            return false;

    boolean aMatchFlag = false;
    for(int i=0; i< aList.size(); i++){
        if (!bList.contains(aList.get(i))) {
            return false;
        }
    }
    aMatchFlag = true;
    System.out.println("All elements of A are present in B");
    boolean bMatchFlag = false;
    for(int i=0; i< bList.size(); i++){
        if (!aList.contains(bList.get(i))) {
            return false;
        }
    }
    bMatchFlag = true;
    System.out.println("All elements of B are present in A");

    if(aMatchFlag && bMatchFlag)
            return true;
    else
            return false;
}

对于那些也在寻找代码性能的人

Input:1.11.11, 2.11.11.11
Compilation time: 1.45 sec, absolute running time: 0.24 sec, cpu time: 0.26 sec, memory peak: 18 Mb, absolute service time: 1,7 sec

Input:1.11.11, 2.11.22
Compilation time: 1.25 sec, absolute running time: 0.24 sec, cpu time: 0.23 sec, memory peak: 18 Mb, absolute service time: 1,49 sec

Input:1.11.2, 2.11.22
Compilation time: 1.34 sec, absolute running time: 0.24 sec, cpu time: 0.24 sec, memory peak: 18 Mb, absolute service time: 1,58 sec


Input:1.11.2, 2.11.111
Compilation time: 1.65 sec, absolute running time: 0.28 sec, cpu time: 0.32 sec, memory peak: 18 Mb, absolute service time: 1,94 sec

推荐阅读