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
梦想还是要有的,万一实现了呢~~~~ヾ(◍°∇°◍)ノ゙~~~~