如何检查字符串是否包含另一个字符串的一部分? (不是整个字符串)

时间:2018-04-04 20:08:58

标签: java string

我有2个字符串:

1)约翰有2个苹果。

2)科迪在约翰的地下室玩xbox。

现在这两个字符串有" John"共同的

但似乎没有编程方式来检查这一点。我能得到的最接近的是如何检查字符串是否包含特定单词:str1.toLowerCase().contains(str2.toLowerCase())

那么如何检查String 1)是否包含String 2)的一部分?

3 个答案:

答案 0 :(得分:1)

这可行吗

public static void main(String[] args) {
    String x = "John has 2 apples.";
    String y = "Cody plays xbox in John's basement.";
    // print words of x that matches any of y
    findMatch(Arrays.asList(x.split(" ")), y);
    // print words of y that matches any of x
    findMatch(Arrays.asList(y.split(" ")), x);

}

private static void findMatch(List<String> firstArr,String statement) {
    for (String string : firstArr) {
        if(statement.contains(string)) {
            System.out.println(string);
        }
    }
}

答案 1 :(得分:0)

如果您正在谈论两个字符串,则必须为每个字符串创建一个矩阵,即

1)&#34; abcd&#34;

2)&#34; cdef&#34;

Matrix)

ac bc cc dc
ad bd cd dd
ae be ce de
af bc cf df

然后在上面的例子中检查是否会出现在诊断模式中的双打(例如ccdd)。

这意味着,您将不得不为每个字符串迭代另一个字符串的每个字符串,所以我相信这会给你O(n ^ 2)时间复杂度。对于每个对角线匹配,这将是匹配的标记(并且可以有多个)。正如@lexicore所说,这与最常见的子串不同。

如果它们是非常大的字符串,您可能不想通过每个字符串,而是将它们标记化(即通过空格分割它们)并为每个字符串创建排序列表(或哈希表或其他内容)所以你可以在O(log n)ish time中遍历每一个。我认为这会给你类似O((log n)^ 2),但至少比O(n ^ 2)好。

答案 2 :(得分:0)

基于https://stackoverflow.com/a/4448435/3790546

private static List<String> interection(String s1, String s2) {
    HashSet<String> h1, h2;
    h1 = toHashSet(s1);
    h2 = toHashSet(s2);
    h1.retainAll(h2);
    return h1.stream().collect(toList());
}

private static HashSet<String> toHashSet(String s) {
    return Arrays.stream(s.split("[\\s@&.'?$+-]+")).collect(Collectors.toCollection(HashSet::new));
}

public static void main (String [] args) {
    interection("John has 2 apples.", "Cody plays xbox in John's basement.").forEach(s -> System.out.println(s));
}