在矩阵中查找有效单词

时间:2012-07-12 23:31:10

标签: algorithm

给出一个单词词典,两个API Is_word(串) Is_prefix(串) 还有一个NxN矩阵,每个位置由一个字符组成。如果从任何位置(i,j)你可以移动 在四个方向中的任何一个方向上,找出可以在矩阵中形成的所有有效单词。 (不允许循环,即如果从(i,j)开始并移动到(i-1,j)则形成单词位置 从这个位置你不能回到(i,j))

我可以看到::我可以看到一个指数级的解决方案,我们可以通过所有可能性来跟踪已经访问过的索引。我们能有更好的解决方案吗?

3 个答案:

答案 0 :(得分:2)

这是我能做的最好的事情:

  1. 在一半允许的方向上枚举所有可能的字符串。 (你可以反转字符串以获得其他方向。)
  2. 对于每个字符串中的每个起始字符位置,构建子字符串,直到它们既不是单词也不是前缀。
  3. 编辑:我可能误解了这个问题。我认为每个单词只能由同一方向的动作组成。

答案 1 :(得分:0)

我倾向于通过创建两个并行数据结构来解决这个问题。一个是单词列表(删除重复项)。另一个是前缀矩阵,其中每个元素都是一个列表。希望可以使用这样的数据结构。列表矩阵实际上可以是三元组列表,其中单词和坐标位于原始矩阵中。

在任何情况下,遍历原始矩阵并在每个元素上调用isword()。如果是单词,则将单词插入单词列表。

然后浏览原始矩阵,并比较每个元素上的call isprefix()。如果是前缀,请在前缀矩阵中插入。

然后,浏览前缀矩阵并测试前缀的四个组合和附加字母。如果一个单词,则放入单词列表。如果是前缀,则在最后一个字母的位置添加前缀矩阵。请记住同时执行这两项操作,因为单词可以是前缀。

此外,在前缀列表中,您不仅要保留字母列表,还要保留已使用字母的位置。这用于防止循环。

然后继续此过程,直到没有单词和没有前缀。

很难衡量这种结构的复杂性,因为它似乎取决于字典的内容。

答案 2 :(得分:0)

我认为你不能在这里击败指数。证明?

考虑这种情况,当你有一个矩阵,你有一个字母排列,使得每个组合是一个有效的字典单词,即当你从[i,j]开始,例如, [i,j]结合[i-1,j]或[i + 1,j]或[i,j + 1]或[i,j-1]都是2个字母的单词,并且递归地继续,即任何长度n的组合(根据你的规则)是一个单词。在这种情况下,你不能比蛮力更好。