用于确定单词列表是否形成单词square的算法

时间:2016-10-19 04:44:42

标签: algorithm

显然这是一个问我的朋友谷歌的问题。问题是,给出四个4字母的单词,确定它们是否形成一个单词方格。然后,展开它以便可以解决任何n个字母的单词。单词square的一个例子是:

C A T S

A B E O

T E L M

S O M E

我们能想到的最快的方法是O(n!)尝试所有可能的单词配置排列,然后O(n)检查它是否形成一个单词square,这可以通过检查是否有一个方面来完成对角线等于另一个。

3 个答案:

答案 0 :(得分:0)

(这是一个算法,你可以用它来制作一个程序。这在程序中很容易制作,但很明显,如果一个人能够把它画出来,他就能快速看出它是否能够如果你愿意的话,我可以给你写一个可以做到这一点的java程序。)

1)我将制作一个2D数组,每个单词的第一个字母位于第一列,第一行由第一个单词组成。

C A T S

A B E O

T E L M

S O M E

2)然后检查第一列是否等于第一个单词,第二列是否等于第二个单词,依此类推。 (由于第一行字面上是第一个字,检查第一列是否等于第一个字基本上会检查第一行是否等于第一列。)

答案 1 :(得分:0)

一种有点过分简单的方法是形成每个单词的所有首字母的多重集,然后搜索包含完全相同的字母和字母计数的单词,作为首字母的多集。如果找到匹配项,我们会删除该字词。接下来,我们寻找一个单词,其后缀(从第二个字母开始)匹配剩余单词的第二个字母的多个集合。如果找到匹配项,我们将其删除,然后检查第三个字母,依此类推。

这是一个Python实现,它使用collections.Counter类代替多重集。

from collections import Counter

def word_square(words):
    words = list(words)
    n = len(words)
    assert all(len(w) == n for w in words)

    result = []

    for i in range(n):
        letters = Counter(w[i] for w in words)
        match = next((w for w in words if Counter(w[i:]) == letters), None)

        if not match:
            return None

        words.remove(match)
        result.append(match)

    return result

如果我没弄错的话,这个解决方案是O(n^3),这不是很好,但它比O(n!)有所改进。

答案 2 :(得分:-1)

这看起来像矩阵转置问题。因此,如果原始矩阵及其转置相等,则它将形成一个单词正方形,