【问题标题】:Given a 2D matrix of characters we have to check whether the given word exist in it or not给定一个二维字符矩阵,我们必须检查给定的单词是否存在于其中
【发布时间】:2013-06-20 04:09:38
【问题描述】:

给定一个二维字符矩阵,我们必须检查给定的单词是否存在于其中。 例如

 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. 
}

有没有更好的方法?

【问题讨论】:

  • 什么是最好的方法,部分取决于单词的规则,你没有足够清楚地说明问题是可以解决的。一个单词的字母是否必须在一条直线上,或者任何路径都可以?路径可以自己交叉和/或重复使用字母吗?此外,应用了两种不同的 O() 函数:一种用于预处理,一种用于搜索。预处理后,你可能会先寻找稀有字母或稀有元组
  • 这里的一个重要问题是:要搜索的单词的最大长度是多少?这可以改变整个故事。

标签: c++ algorithm multidimensional-array


【解决方案1】:

让我为这个问题描述一个非常酷的数据结构。

继续查找尝试。

将一个 k 长度的词插入 Trie 需要 O(k) 时间,查找一个 k 长度的词的存在需要 O(k) 时间。

Video tutorial

如果您在理解或实现数据结构时遇到问题,我很乐意为您提供帮助。

【讨论】:

  • 这不是假设没有重复吗?
  • OP 要求检查是否存在,而不是计数,但后者可以很容易地修复。如果您实现 trie,只需对该代码进行一点修改。
  • 对不起,我不是很清楚。我的意思是重复的字母,而不是重复的字符串。例如,trie 不会在以下矩阵中检测到单词bat[b n t; a x a; f p j]
  • 不,它不会。我们根据问题中指定的规则构造特里树。因此特里树将仅包含可以从矩阵中形成的有效单词。
  • 链接失效了,看来!!
【解决方案2】:

使用简单循环查找第一个字母或您的单词,找到后使用以下递归函数。

该函数将获取 5 个参数作为输入:您要查找的单词 str、您在数组中查找的单词 str 中的当前位置 ki 和 @987654325 @ 作为数组中的位置来搜索字母和方向d

停止条件为:

-如果k > strlen(str); return 1;

-如果arr[i][j] != str[k]; return 0;

如果上面的语句都不是真的,你增加你的字母计数器k++;根据您的 d 值更新您的 ij 并通过 return func(str, k); 再次调用您的函数

【讨论】:

    【解决方案3】:

    实际上你这里有 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) 中检查一个序列。

    【讨论】:

    • '任何路径'根本不是准确的术语。路径的长度是多少?可以重叠吗?对于“任何”路径,我只能说您将拥有“任何”复杂性。
    【解决方案4】:

    我想我会分两个阶段进行:

    1) 遍历数组,寻找单词中第一个字母的实例。

    2) 每当您找到第一个字母的实例时,调用一个检查所有相邻单元格(例如最多 9 个)的函数,以查看其中是否有任何一个是单词的第二个字母。对于找到的任何第二个字母匹配,此函数将递归调用自身并在相邻的单元格中查找第三个字母匹配(依此类推)。如果递归一直到达单词的最后一个字母并找到它的匹配项,则该单词存在于数组中。 (请注意,如果您不允许使用两次字母,则需要将单元格标记为“已使用”,以防止算法重新使用它们。可能最简单的方法是通过-按值将已使用的单元格坐标向量传入递归函数,并让递归函数忽略该列表中任何单元格的内容)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-21
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      • 2019-08-30
      相关资源
      最近更新 更多