【DFS深度优先遍历】 字母表问题

数据结构与算法


题目类型描述: 给出一个二维的字母板和一个单词,寻找字母板网格中是否存在这个单词(单词可以由按顺序的相邻单元的字母组成,其中相邻单元指的是水平或者垂直方向相邻。每个单元中的字母最多只能使用一次)。

具象理解

       假设有这样一个二维字母表(如图)和单词“ABCCED”:
字母表问题
有如下路径存在:
字母表问题
我们应该返回“true”。

抽象建模

       可以根据题给的二维字母表构建这样的二维boolean型数组,通过查找上下左右四个方向的字母,深度遍历。
       不过我们需要清楚一点,我们在遍历的时候往往在做重复工作(检验上下左右四个字母是否符合要求),而且逐层深入,故考虑递归,将大问题划分为一个个小问题解决。分析时我们发现每个“小问题”都包含这两个操作:

  1. 检验当前字母是否符合要求。
  2. 检验它的相邻字母是否也符合要求(如果不符合的话即便该字母正确,依然没用,该返回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"));
	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值