找到放在Scrabble板上的所有单词

时间:2011-06-16 13:25:29

标签: python

任何想法都是一种简单快捷的方法,将所有单词放在Scrabble板上,而电路板由2D Array of char表示?

提前致谢

3 个答案:

答案 0 :(得分:5)

这类似于Artsiom's answer,但涵盖了Scrabble板在单词之间会有空格的事实。

所以假设你的“2D数组字符”看起来像这样:

board = [['s','t','a','c','k',' ',' ',' '],
         ['p',' ',' ','a',' ','c',' ',' '],
         ['o','v','e','r','f','l','o','w'],
         ['o',' ','a','t',' ','a',' ','a'],
         ['n','o','t',' ',' ','m','a','t'],
         [' ',' ','e',' ',' ',' ',' ','e'],
         [' ',' ','r',' ',' ',' ',' ','r'],
         [' ','e','y','e','s',' ',' ',' ']]

您可以执行以下操作:

import itertools
rows = (''.join(row) for row in board)
columns = (''.join(column) for column in zip(*board))
words = [word for line in itertools.chain(rows,columns) for word in line.split() if len(word) > 1]

给出了:

['stack', 'overflow', 'at', 'not', 'mat', 'eyes', 'spoon', 'eatery', 'cart', 'clam', 'water']

我们正在做的是将每一行和每一列字符转换为'not mat'之类的字符串,然后使用str.split()扔掉空格,为我们提供一个单词列表,扔掉任何字符串一封信长。

使用itertools.chain()只允许我们在单个列表理解中循环遍历行和列。

答案 1 :(得分:3)

在每列中从上到下搜索连续的字符集,然后在每行中从左到右搜索相同的字符。它将是O(n ^ 2),但我认为你不会变得更好。

答案 2 :(得分:0)

如果我对你的理解正确,你也可以尝试使用这样的东西:

a = [['w','o','r','d'],
     ['i','p','o','d'],
     ['k','u','a','k'],
     ['i','s','d','s']]

lines = (''.join(line) for line in a)
rows = (''.join(line) for line in zip(*a))

print list(lines)
print list(rows)