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

这篇博客探讨了如何使用深度优先遍历(DFS)解决字母表问题,即在一个二维字母板中查找给定单词是否存在。博客首先介绍了问题的具体描述,然后通过具象理解和抽象建模的方式进行解析,并提供了利用DFS实现的Java代码。最后,作者总结了DFS与动态规划(DP)在思考方式上的相似之处,强调了递归在解决问题中的关键作用。

数据结构与算法


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

具象理解

       假设有这样一个二维字母表(如图)和单词“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"));
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值