leercode Word Search

来源:互联网 发布:自组织网络算法 编辑:程序博客网 时间:2024/06/06 03:55

题目

Given a 2D board and a word, find if the word exists in the grid.

The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once.

For example,
Given
board =

[  ['A','B','C','E'],  ['S','F','C','S'],  ['A','D','E','E']]

word = "ABCCED", -> returnstrue,
word = "SEE", -> returnstrue,
word = "ABCB", -> returnsfalse.

思路

顺序遍历board,找到其中与word第一个字符相等的字符,将其入栈,循环将栈顶结点四周可能的元素入栈,直到匹配完成整个word或者栈空。


struct Node{  int x;  int y;  char Char;  int i;  Node(){}  Node(int xTemp, int yTemp, char CharTemp, int iTemp):x(xTemp) , y(yTemp) , Char(CharTemp),i(iTemp){}  void Create(int xTemp, int yTemp, char CharTemp, int iTemp){      x = xTemp;      y = yTemp;      Char = CharTemp;      i = iTemp;  }  void Create(Node &Temp){      x = Temp.x;      y = Temp.y;      Char = Temp.Char;      i = Temp.i;  }};class Solution {public:    bool exist(vector<vector<char>>& board, string word) {        int hight = board.size();        int width = board[0].size();        vector<vector<bool>> visited(hight,vector<bool>(width,false));        for(int i = 0 ; i < hight ;i++){            for(int j = 0 ; j < width ; j++){                if(board[i][j] == word[0]){                    if(IsWordExist(board,word,i,j,visited) == true){                        return true;                    }                }            }        }        return false;    }        bool IsWordExist(vector<vector<char>>& board , string word , int x ,int y ,vector<vector<bool>>& visited){        stack<Node> CharStk;  //字符栈         Node Temp(x,y,board[x][y],0);        Node left;        Node right;        Node up;        Node down;        Node Top;        CharStk.push(Temp);        while(!CharStk.empty()){            Top.Create(CharStk.top());            if(Top.Char == word[Top.i]){                if(visited[Top.x][Top.y] == false){                    if(Top.i == word.size()-1){                        return true;                    }                    visited[Top.x][Top.y] = true;                    if((Top.x-1) >= 0){                        if(visited[Top.x-1][Top.y] == false){                            left.Create(Top.x-1, Top.y, board[Top.x-1][Top.y], Top.i+1);                            CharStk.push(left);                        }                    }                    if((Top.x+1) < board.size()){                        if(visited[Top.x+1][Top.y] == false){                            right.Create(Top.x+1, Top.y, board[Top.x+1][Top.y], Top.i+1);                            CharStk.push(right);                        }                    }                    if((Top.y-1) >= 0){                        if(visited[Top.x][Top.y-1] == false){                            down.Create(Top.x, Top.y-1, board[Top.x][Top.y-1], Top.i+1);                            CharStk.push(down);                        }                    }                    if((Top.y+1) < board[0].size()){                        if(visited[Top.x][Top.y+1] == false){                            up.Create(Top.x, Top.y+1, board[Top.x][Top.y+1], Top.i+1);                            CharStk.push(up);                        }                    }                }                else{                    CharStk.pop();                    visited[Top.x][Top.y] = false;                }            }else{                 CharStk.pop();            }        }        return false;    }};




0 0
原创粉丝点击