比较java中的两个字符串并识别重复的单词

时间:2013-01-08 16:02:57

标签: java string duplicates

我正在尝试比较两个字符串并识别重复的单词。例如;

String1 = "Hello, my name is John."
String2 = "Can you tell me your name please?"

比较String1和String2将返回单词; “名称”。

我知道可以将这两个字符串拆分成一个单词数组,然后在二维数组中迭代每个字符串的每个字。然而,这在O(n ^ 2)的计算上是昂贵的,我想知道是否有更快的方法这样做?

感谢。

编辑:为了清晰起见,更改了示例。

2 个答案:

答案 0 :(得分:12)

将字符串转换为字数组后:

您可以将第一个数组中的所有元素添加到散列映射中,然后扫描第二个数组以查看散列映射中是否存在每个元素。由于对散列映射的访问时间是O(1),因此这将是O(n + m)时间复杂度。

如果您不想使用额外的空间,可以在O(nlogn)中对两个数组进行排序,然后比较O(n + m)中的项目,这些项目总共会得到O(nlogn)。

答案 1 :(得分:6)

一个简单的解决方案是使用Guava Sets.intersection的{​​{1}}方法。这很简单:

Sets

输出:

String s1 = "Hello, my name is John.";
String s2 = "Can you tell me your name?";
Splitter splitter = Splitter.onPattern("\\W").trimResults().omitEmptyStrings();
Set<String> intersection = Sets.intersection(//
        Sets.newHashSet(splitter.split(s1)), //
        Sets.newHashSet(splitter.split(s2)));
System.out.println(intersection);

您还可以在this thread上找到有关检测集合交集的算法的更多信息。