计算具有相同字母的相似单词的数量

时间:2015-07-02 10:14:14

标签: java algorithm logic

问题:

  

如何识别或统计具有相同词的相似词的数量   字母(字母数应相同,顺序可以是任何东西)。

例如,下面是单词:

aabb, aaab, abbb, abaa, abab, aabc, caba, babb, baaa

以下是类似的词:

aabb, abab
aaab, abaa, baaa
abbb, babb
aabc, caba

以下是我得到的基本逻辑:

方法一: 首先按单个单词对字母进行排序。 比较排序的单词。

方法2: 比较剩余单词中每个单词的每个字母。 (这将是最高迭代次数)

请建议一些更好的逻辑解决..

5 个答案:

答案 0 :(得分:0)

好吧,如果你有效地使用排序的单词,你的方法1几乎可以有效地解决这个问题。

首先,对单词进行排序。

现在您已将问题缩减为Element Distinctness Problem,"类似的字词"刚刚变得相同。

可以通过以下两种方式之一完成:

  • 对(已排序的)单词列表进行排序,并迭代,所有"类似的"话 将彼此相邻。
  • 在维护哈希表的同时进行迭代,该哈希表计算您看到每个单词的次数。 (这种方法不需要第二种类型)。

您可以使用直方图,其中每个直方图计算每个字符的出现次数。为每个单词都有这样的直方图,并检查相同的直方图。

答案 1 :(得分:0)

首先,您需要拥有LetterCluster的课程。在该课程中,您应该存储Map字符和数字,长度数字以及符合该组的单词。然后,想法是迭代每个单词和每个迭代中的所有单词和所有现有组:

  1. 您可以将String的长度与组的字符数进行比较。如果它们不匹配,则无需进一步分析,因为不同长度的字符串不能具有相同的字母

  2. 如果长度相同。如果String的地图与群组地图等效,则将String添加到群组的词汇集中并停止迭代

  3. 如果找不到该单词的兼容组,则创建一个新组,将单词的长度,Map及其自身存储在集合中。

  4. 请注意,此分组有效地对您的单词进行分区,您可以在同一组中看到具有相同字母的单词。

答案 2 :(得分:0)

我说:计算每个不同的字母。然后比较计算出的数字。

喜欢' aabb' => a = 2,b = 2; ' ABAB' => a = 2,b = 2; ' AAAB' => a = 3,b = 2。

时间复杂度应该很好,但内存复杂度与您正在使用的字母表中包含的字母数量呈线性关系。

答案 3 :(得分:0)

我不应该给你一个完整的答案,但我有一个简洁的功能解决方案:

Stream.of("aabb", "aaab", "abbb", "abaa", "abab", "aabc", "caba", "babb", "baaa")
      .map(s -> s.chars().boxed().collect(Collectors.groupingBy(i -> (char) i.intValue(), Collectors.counting())))
      .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))

答案 4 :(得分:0)

首先以某种精确的方式定义相似性。

如果符合以下条件,您可以说两个字是相似的:

A1。它们是用相同的字母构建的

A2。来自位置p的单词w1的字母可以在单词2中的位置(p-N ... p + N)

中找到

以上defs都可以满足您的要求,但不同。