我想查找两个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"
答案 0 :(得分:1)
查找两个Java字符串是否包含2个必须相邻的公共字符。
可能有很多极端情况,但这是一种解决方法(可能不是最快的方法,但可以根据您的需要工作)。
分别迭代两个字符串,并为所有2个字符对创建两个HashSets
。
例如foobar
-> fo
,oo
,ob
,ba
,ar
只需将上面创建的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)。