问题:
如何识别或统计具有相同词的相似词的数量 字母(字母数应相同,顺序可以是任何东西)。
例如,下面是单词:
aabb, aaab, abbb, abaa, abab, aabc, caba, babb, baaa
以下是类似的词:
aabb, abab
aaab, abaa, baaa
abbb, babb
aabc, caba
以下是我得到的基本逻辑:
方法一: 首先按单个单词对字母进行排序。 比较排序的单词。
方法2: 比较剩余单词中每个单词的每个字母。 (这将是最高迭代次数)
请建议一些更好的逻辑解决..
答案 0 :(得分:0)
好吧,如果你有效地使用排序的单词,你的方法1几乎可以有效地解决这个问题。
首先,对单词进行排序。
现在您已将问题缩减为Element Distinctness Problem,"类似的字词"刚刚变得相同。
可以通过以下两种方式之一完成:
您可以使用直方图,其中每个直方图计算每个字符的出现次数。为每个单词都有这样的直方图,并检查相同的直方图。
答案 1 :(得分:0)
首先,您需要拥有LetterCluster
的课程。在该课程中,您应该存储Map
字符和数字,长度数字以及符合该组的单词。然后,想法是迭代每个单词和每个迭代中的所有单词和所有现有组:
您可以将String
的长度与组的字符数进行比较。如果它们不匹配,则无需进一步分析,因为不同长度的字符串不能具有相同的字母
如果长度相同。如果String
的地图与群组地图等效,则将String
添加到群组的词汇集中并停止迭代
如果找不到该单词的兼容组,则创建一个新组,将单词的长度,Map
及其自身存储在集合中。
请注意,此分组有效地对您的单词进行分区,您可以在同一组中看到具有相同字母的单词。
答案 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都可以满足您的要求,但不同。