我有2个字符串:
1)约翰有2个苹果。
2)科迪在约翰的地下室玩xbox。
现在这两个字符串有" John
"共同的
但似乎没有编程方式来检查这一点。我能得到的最接近的是如何检查字符串是否包含特定单词:str1.toLowerCase().contains(str2.toLowerCase())
那么如何检查String 1)是否包含String 2)的一部分?
答案 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
然后在上面的例子中检查是否会出现在诊断模式中的双打(例如cc
和dd
)。
这意味着,您将不得不为每个字符串迭代另一个字符串的每个字符串,所以我相信这会给你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));
}