给定2D字符矩阵,我们必须检查给定的单词是否存在。 例如
s f t
d a h
r y o
我们可以找到“老鼠 (自上而下,直线,对角线或任何路径)..即使在逆序中也是如此。最不复杂的。
我的方法是
While traversing the 2d matrix ( a[][] ) row wise.
If ( a[i][j] == first character of given word ) {
search for rest of the letters in 4 directions i.e. right, right diagonally down, down and left diagonally down.
} else if( a[i][j] == last character of the given word ) {
search for remaining characters in reverse order in 4 directions i.e. left, right diagonally up, up, left diagonally up.
}
还有更好的方法吗?
答案 0 :(得分:2)
让我为这个问题描述一个非常酷的数据结构。
继续查找Tries。
将一个k长度的字插入Trie需要O(k)的时间,而O(k)则需要查找k长度字的存在。
如果您在理解数据结构或实施数据时遇到问题,我将很乐意为您提供帮助。
答案 1 :(得分:0)
实际上你在这里有16个序列:
sft
dah
ryo
sdr
fay
tho
sao
rat
tfs
had
oyr
rds
yaf
oht
oas
tar
(3水平+ 3垂直+2对角线)* 2(反转)= 16.令n为矩阵的大小。在您的示例中,n = 3.序列数=(n + n + 2)* 2 = 4n + 4。
现在您需要确定序列是否为单词。使用字典中的单词(在Internet上找到)创建一个哈希集(C ++中的unordered_set
,Java中的HashSet
)。您可以在O(1)中检查一个序列。
答案 2 :(得分:0)
我想我会分两个阶段来做这件事:
1)迭代数组,查找单词中第一个字母的实例。
2)每当你找到第一个字母的实例时,调用一个检查所有相邻单元格(例如最多9个单元格)的函数,看看它们中的任何一个是否是单词的第二个字母。对于找到的任何第二个字母匹配,此函数将递归调用自身并在与其相邻的单元格中查找第三个字母匹配(依此类推)。如果递归一直到达单词的最后一个字母并找到匹配,那么该单词就存在于数组中。 (请注意,如果您不允许使用两次字母,则需要将单元格标记为“已使用”以防止算法重复使用它们。可能最简单的方法是通过 - by-value一个已经用过的单元格坐标向量递归函数的向量,并使递归函数忽略该列表中任何单元格的内容)
答案 3 :(得分:0)
使用简单的循环查找第一个字母或单词,当您找到它时使用以下递归函数。
该函数将输入5个参数:您要查找的单词str
,您在数组str
中查找的单词k
中字母的当前位置, i
和j
作为数组中搜索字母和方向d
的位置。
停止条件为:
-if k > strlen(str); return 1;
-if arr[i][j] != str[k]; return 0;
如果上面的陈述均不正确,则增加字母计数器k++
;根据您i
的值更新j
和d
,然后通过return func(str, k);