给出一个单词词典,两个API Is_word(串) Is_prefix(串) 还有一个NxN矩阵,每个位置由一个字符组成。如果从任何位置(i,j)你可以移动 在四个方向中的任何一个方向上,找出可以在矩阵中形成的所有有效单词。 (不允许循环,即如果从(i,j)开始并移动到(i-1,j)则形成单词位置 从这个位置你不能回到(i,j))
我可以看到::我可以看到一个指数级的解决方案,我们可以通过所有可能性来跟踪已经访问过的索引。我们能有更好的解决方案吗?
答案 0 :(得分:2)
这是我能做的最好的事情:
答案 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的组合(根据你的规则)是一个单词。在这种情况下,你不能比蛮力更好。