leetcode 79. Word Search
一、问题描述
给定一个2D板和一个单词,找出该单词是否存在于该2D网格中。这个搜索词可以由顺序相邻单元格的字母构成,其中“相邻”单元格是那些水平(左右)相邻或垂直(上下)相邻的单元格。 同一个字母单元格不能使用多次。
二、解题思路
典型的DFS题型
- 终止条件(数据非法):走到给定范围边界之外 -- i<0||j>0||i>row_size||j>col_size -- return false
- 收敛条件(满足输出一种解):cur_index == word_len-1 -- return true
- 剪枝条件(遍历错误解回退):visit[i][j] == true(该元素访问过) || broad[i][j] != word[cur_index] -- return false
- 递归方向:上--[i-1][j] 下--[i+1][j] 左--[i][j-1] 右--[i][j+1]
【注意】终止条件、收敛条件、剪枝条件不一定在每个dfs问题中都存在,而且它们的顺序要按照具体问题情境放置~~
注:
- i,j分别表示当前索引二维空间**broad的行、列下标
- row_size、col_size分别表示二维空间**broad的所有行和所有列
- cur_index 表示当前索引单词*word的下标
- bool visit[i][j] 表示当前元素是否被访问
三、算法实现
/********************************************************* Author: tmw date:2018-5-16 *********************************************************/ #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> bool dfs_matrix( char** board, int row_size, int col_size, char* word, int i, int j, int cur_index, bool** visit ) { //收敛条件----把收敛条件放到终止条件的上面是为了正确返回 borad 为[[a]],word为"a"的情况 if( cur_index == strlen(word) ) return true; //终止条件 if( i<0 || j<0 || i >= row_size || j >= col_size ) return false; //剪枝 if( visit[i][j] ) return false; if( board[i][j] != word[cur_index] ) return false; //更新元素遍历状态 visit[i][j] = true; //四个方向的递归---上、下、左、右 bool ans; ans = dfs_matrix(board,row_size,col_size,word,i-1,j,cur_index+1,visit) || dfs_matrix(board,row_size,col_size,word,i+1,j,cur_index+1,visit) || dfs_matrix(board,row_size,col_size,word,i,j-1,cur_index+1,visit) || dfs_matrix(board,row_size,col_size,word,i,j+1,cur_index+1,visit); visit[i][j] = false; //状态回退 return ans; } bool exist(char** board, int boardRowSize, int boardColSize, char* word) { //入参定义及初始化 int i,j; bool** visit = (bool**)malloc(boardRowSize*sizeof(bool*)); for( i=0; i<boardRowSize; i++ ) visit[i] = (bool*)malloc(boardColSize*sizeof(bool)); for( i=0; i<boardRowSize; i++ ) for( j=0; j<boardColSize; j++ ) visit[i][j] = false; //执行dfs操作 for( i=0; i<boardRowSize; i++ ) for( j=0; j<boardColSize; j++ ) if(dfs_matrix(board,boardRowSize,boardColSize,word,i,j,0,visit)) return true; return false; }
四、执行结果
leetcode accpet
梦想还是要有的,万一实现了呢~~~~ヾ(◍°∇°◍)ノ゙~~~~