查找包含常见字符的两个字符串的最快算法

时间:2018-10-26 10:49:28

标签: java algorithm

我想查找两个Java字符串是否包含2个公共字符,这些字符必须彼此相邻。

我正在使用两个for循环进行检查,但这似乎很慢,因为我必须一次又一次地对其进行计算。

boolean contain2CommonChars(String s1, String s2) {
     for(){
       for() {
       }
    }
}

是否有一种有效的算法可以做到这一点?

第二,我真正想做的是从一个给定另一个句子x的大句子集B中找到一个句子子集A。如果B中的任何句子中至少有两个与x相同的字符,则将其放入A集。

Set<String> findSubset(Set<String> B, String x){
    Set<String> A = new HashSet<>();

    ...
    return A;      
}

顺便说一下,B的大小<10,000。可以在几毫秒内完成findSubset()吗?

编辑:第二个问题与第一个问题有关。 示例:

B = {"this is a dog", "this is a bat", "that was an dog "}
x = "this is not a cat"

我想返回:

A = {"this is a dog", "this is a cat"} //  because of "this is" or "is a"

3 个答案:

答案 0 :(得分:1)

  

查找两个Java字符串是否包含2个必须相邻的公共字符。

可能有很多极端情况,但这是一种解决方法(可能不是最快的方法,但可以根据您的需要工作)。

  • 分别迭代两个字符串,并为所有2个字符对创建两个HashSets

    例如foobar-> foooobbaar

  • 只需将上面创建的HashSets的一个交集看是否存在任何公共对。

很难理解第二个问题。也许尝试包括一个例子以使其更清楚。

答案 1 :(得分:0)

通过迭代2个字符串中最短的每个相邻对:

static boolean contain2CommonChars(String s1, String s2) {
    int l1 = s1.length();
    int l2 = s2.length();

    if ((l1 < 2) || (l2 < 2))
        return false;

    if (l2 < l1) {
        String temp = s1;
        s1 = s2;
        s2 = temp;
    }

    for (int i = 0; i < s1.length() - 1; i++){
        String pair = s1.substring(i, i + 2);
        if (s2.contains(pair))
            return true;
    }

    return false;
}

public static void main(String[] args) {
    String s1 = "abcghj";
    String s2 = "shhcgop";

    System.out.println(s1 + " and " + s2 + " " + contain2CommonChars(s1, s2));

    String s3 = "abcghjlo";
    String s4 = "shhcop";

    System.out.println(s3 + " and " + s4 + " " + contain2CommonChars(s3, s4));
}

打印

abcghj and shhcgop true
abcghjlo and shhcop false

答案 2 :(得分:0)

仅回答第一个问题。


如果可以对字符串进行预处理,则为每个字符串生成所有字符对并对其进行逐步排序。

contain2CommonChars -> 2C ai ar Ch co Co ha in mm mo n2 nC nt om on on rs ta

现在,两个字符串之间的公共对可以通过一次类似合并的过程找到,最多可获取O(L)。

相关问题