显然这是一个问我的朋友谷歌的问题。问题是,给出四个4字母的单词,确定它们是否形成一个单词方格。然后,展开它以便可以解决任何n个字母的单词。单词square的一个例子是:
C A T S
A B E O
T E L M
S O M E
我们能想到的最快的方法是O(n!)尝试所有可能的单词配置排列,然后O(n)检查它是否形成一个单词square,这可以通过检查是否有一个方面来完成对角线等于另一个。
答案 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)
这看起来像矩阵转置问题。因此,如果原始矩阵及其转置相等,则它将形成一个单词正方形,