数据结构与算法
题目类型描述: 给出一个二维的字母板和一个单词,寻找字母板网格中是否存在这个单词(单词可以由按顺序的相邻单元的字母组成,其中相邻单元指的是水平或者垂直方向相邻。每个单元中的字母最多只能使用一次)。
具象理解
假设有这样一个二维字母表(如图)和单词“ABCCED”:
有如下路径存在:
我们应该返回“true”。
抽象建模
可以根据题给的二维字母表构建这样的二维boolean型数组,通过查找上下左右四个方向的字母,深度遍历。
不过我们需要清楚一点,我们在遍历的时候往往在做重复工作(检验上下左右四个字母是否符合要求),而且逐层深入,故考虑递归,将大问题划分为一个个小问题解决。分析时我们发现每个“小问题”都包含这两个操作:
- 检验当前字母是否符合要求。
- 检验它的相邻字母是否也符合要求(如果不符合的话即便该字母正确,依然没用,该返回false的结果)。
代码如下:
package lint_code5;
public class Solution123 {
public static void main(String args[]){
char[][] board=new char[3][4];
board[0]="ABCE".toCharArray();
board[1]="SFCS".toCharArray();
board[2]="ADEE".toCharArray();
print(board);//构建字母表
System.out.println(exist(board, "ABCCED"));