这是一个来自here
的问题如果Levenshtein距离为1,则两个单词是朋友(有关详细信息,请参阅http://en.wikipedia.org/wiki/Levenshtein_distance)。也就是说,你可以在单词X中添加,删除或替换一个字母来创建单词Y.单词的社交网络由其所有朋友,他们所有朋友以及他们所有朋友的朋友组成,依此类推。编写一个程序告诉我们“你好”这个词的社交网络有多大,使用这个单词列表https://raw.github.com/codeeval/Levenshtein-Distance-Challenge/master/input_levenshtein_distance.txt 输入
您的程序应该接受第一个参数作为文件名的路径。输入文件包含单词列表。此列表也可在https://raw.github.com/codeeval/Levenshtein-Distance-Challenge/master/input_levenshtein_distance.txt处获得 输出
打印出“你好”这个词的社交网络有多大。例如“abcde”这个词的社交网络是4846。
任何人都可以帮助提出相同的逻辑。 这不是家庭工作的问题。
答案 0 :(得分:5)
一个简单的O(n^2)
解决方案是将问题建模为graph:
G = (V,E)
,其中V = { all words }
和E = { (u,v) | u is friend of v }
。
由此,下一个算法遵循(高级伪代码):
1. Create the graph from the data
2. Run a BFS from the source, and continue while there are more
vertices that can be discovered.
3. When you are done, the size of the `visited` set is the size of
the social network (this set is the actual social network)
<强>复杂度:强>
O(n^2)
(检查所有对)。 O(n^2)
起也是|E| < n^2
,因此您获得了O(n^2)
算法的总数。答案 1 :(得分:2)
您可以使用BFS或DFS或任何返回图形树覆盖的算法,它可以根据您的喜好进行调整。
答案 2 :(得分:2)
如果你知道如何找到Levenshtein距离,你需要知道的是这对词之间的Levenstein距离。
您无需绘制完整的图表。更好的方法是维护一个你知道在单词社交网络中的单词哈希表。这样就可以避免冗余对。这就是我的意思。
假设单词是: 对 亮 赖特
所有对的编辑距离均为1。但如果你只想要Right的社交网络,你不需要考虑Bright和Wright这对。
以这种方式继续检查所有单词,直到您的选中列表中没有添加内容。