华为OD机试E卷 - 找单词(Java & Python& JS & C++ & C )

题目描述

给一个字符串和一个二维字符数组,如果该字符串存在于该数组中,则按字符串的字符顺序输出字符串每个字符所在单元格的位置下标字符串,如果找不到返回字符串“N”。

  1. 需要按照字符串的字符组成顺序搜索,且搜索到的位置必须是相邻单元格,其中“相邻单元格”是指那些水平相邻或垂直相邻的单元格。

  2. 同一个单元格内的字母不允许被重复使用。

  3. 假定在数组中最多只存在一个可能的匹配。

输入描述

第1行为一个数字N指示二维数组在后续输入所占的行数。

第2行到第N+1行输入为一个二维大写字符数组,每行字符用半角,分割。

第N+2行为待查找的字符串,由大写字符组成。

  • 二维数组的大小为N*N,0<N<=100。

  • 单词长度K,0<K<1000。

输出描述

出一个位置下标字符串,拼接格式为:第1个字符行下标+”,”+第1个字符列下标+”,”+第2个字符行下标+”,”+第2个字符列下标… +”,”+第N个字符行下标+”,”+第N个字符列下标。

示例1

输入

4
A,C,C,F
C,D,E,D
B,E,S,S
F,E,C,A
ACCESS

输出

0,0,0,1,0,2,1,2,2,2,2,3

说明

ACCESS分别对应二维数组的[0,0] [0,1] [0,2] [1,2] [2,2] [2,3]下标位置。

解题思路

该题目要求在一个二维字符数组(棋盘)中寻找一个给定的字符串,并按特定规则返回字符串每个字符在数组中的位置。题目的核心是使用深度优先搜索(DFS)方法,从二维数组的每一个字符出发,按顺序查找相邻位置的字符是否能组成目标字符串。如果找到就输出路径下标字符串,如果找不到就返回 “N”。

  1. 字符顺序和相邻性
    • 需要按照给定字符串中字符的顺序在二维字符数组中寻找匹配。
    • 字符在二维数组中的位置必须是相邻的。相邻的定义是:水平方向(左右相邻)或垂直方向(上下相邻)的单元格。
  2. 不可重复使用
    • 在寻找过程中,同一个单元格中的字母不能被重复使用。例如,如果某个位置的字母已经被用来匹配字符串的一部分,那么在匹配同一个字符串的其他部分时不能再次使用这个位置。
  3. 重要条件
    • 假设在二维数组中,最多只有一个可能的匹配路径。这意味着如果找到了一个匹配的字符串路径,就不需要考虑其他可能性。

示例用例解析:

  • 输入:

    4
    A,C,C,F
    C,D,E,D
    B,E,S,S
    F,E,C,A
    ACCE