【问题标题】:Comparing two Strings in java and identifying duplicate words比较java中的两个字符串并识别重复的单词
【发布时间】:2013-01-08 16:02:56
【问题描述】:

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

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

比较 String1 和 String2 会返回单词; “名字”。

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

谢谢。

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

【问题讨论】:

  • 那么,你还想去掉标点符号吗?
  • @fge 抱歉,没有注意到该示例不起作用。我现在改了。

标签: java string duplicates


【解决方案1】:

获取字符串到单词数组后:

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

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

【讨论】:

  • 好的,我会试一试并报告。谢谢
  • hashmap 解决方案可能是最好的,但请记住,对于较长的文本,速度差异可能会更加显着。
  • @jedrus07 是的,这绝对正确,我只是想提出另一个比 O(n^2) 更好的选择
  • 好的,这很好,谢谢。我也将尝试下面的其他答案,看看在我接受这个答案之前它是否运行得更快
【解决方案2】:

一个简单的解决方案是使用 Guava 的SetsSets.intersection 方法。这很容易:

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);

输出:

[name]

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

【讨论】:

  • Splitter 对象应该是 StringSplitter 吗?无法识别拆分器。
  • 顺便说一句,我为此使用Guava 13.0.1
  • 好的。我会选择上面的答案,因为它不需要任何外部库,而且我能够以相当快的速度让它工作。无论如何感谢您的帮助。
猜你喜欢
  • 2012-06-19
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
相关资源
最近更新 更多