二维空间的单词搜素

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问题中都存在,而且它们的顺序要按照具体问题情境放置~~
注:

  1. i,j分别表示当前索引二维空间**broad的行、列下标
  2. row_size、col_size分别表示二维空间**broad的所有行和所有列
  3. cur_index 表示当前索引单词*word的下标
  4. 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



梦想还是要有的,万一实现了呢~~~~ヾ(◍°∇°◍)ノ゙~~~~


猜你喜欢

转载自blog.csdn.net/qiki_tangmingwei/article/details/80369485