给定一个字符矩阵和一个字符串,找出是否可以从矩阵中获取字符串。从矩阵中的每个字符开始,我们可以向上/向下/向右/向左移动。例如,如果矩阵[3] [4]是:
o f a s
l l q w
z o w k
,字符串为follow
,然后该函数应返回true。
我能想到的唯一方法是回溯算法,搜索这个词是否可能。有没有其他更快的算法来解决这个问题?
并且假设我有很多疑问(关于是否存在单词)。那么可以进行一些预处理来更快地回答查询吗?
答案 0 :(得分:1)
您可以使用DFS解决此问题。让我们为问题定义一个图表。图的顶点将包括矩阵的单元格组合的单元格和我们正在搜索的字符串的前缀长度。当我们处于给定的顶点时,这意味着到目前为止,指定前缀的所有字符都匹配,并且我们当前位于给定的单元格。
我们将边缘定义为连接一侧的单元格并执行“有效”事务。这就是我们要搜索的字符串中的下一个单元格。
为了解决这个问题,我们从包含字符串的第一个字母和前缀长度为1的所有单元格中执行DFS(意味着我们匹配了第一个字母)。从那里开始,我们继续搜索,并在每个步骤中计算出当前位置的边缘(单元格/字符串前缀长度组合)。我们在第一次达到长度为L
的前缀时终止 - 字符串的长度。
请注意,DFS可能被视为回溯,但更重要的是跟踪我们已经访问过的图表中的节点。因此,整体复杂性受N * M * L
约束,其中N
和M
是矩阵的维度,L
- 字符串的长度。
答案 1 :(得分:1)
你当然可以找到所有可能的字符串(从字符开始,尽可能地去)。这可以通过递归函数来完成。
<强>格:强>
abc
def
ghi
<强>字符串:强>
abcfedghi
abcfehgd
abcfehi
abedghif
abefc
abefighd
abehgd
abehifc
ad...
...
然后对这些字符串进行排序,在查找单词时,请在列表中使用二进制搜索。 (当寻找一个n字母单词时,你当然只会考虑列表中字符串的前n个字母。)需要大量准备和大量内存,但搜索速度很快。因此,如果您反复使用相同的网格,准备可能最终支付: - )
答案 2 :(得分:1)
下面是用于查找给定字符串是否存在于给定矩阵中的伪代码。这里访问时跟踪矩阵中字符串的位置,并使用回溯来跟踪它。我希望这有用。
static Scanner sc = new Scanner(System.in);