leetcode

来源:互联网 发布:java android sdk 编辑:程序博客网 时间:2024/06/16 09:10

给定一个字符表和一个字符串,判断能否用相邻的字符连接起来形成该字符串。

算法

对每个表中的字符进行一遍DFS。在每次DFS的过程中,记录当前访问过的节点,以免重复访问。若能找到则返回true;否则返回false。

Code

class Solution {public:    bool exist(vector<vector<char>>& board, string word) {        int nowpos = 0, rows = board.size(), cols = board[0].size(), wsize=word.size();        for (int i = 0; i < rows; i++){            for (int j = 0; j < cols; j++){                vector<vector<bool>> passed(rows, vector<bool>(cols, false));                if(dfsrecurtive(board, i, j, rows, cols, nowpos, word, passed,wsize)==wsize) return true;            }        }        return false;    }    int dfsrecurtive(vector<vector<char>> &board, int row, int col, int rows, int cols, int nowpos,         string& word, vector<vector<bool>>& passed, int wsize){        if(board[row][col]!=word[nowpos]) return -1;        if(board[row][col]==word[nowpos]) nowpos++;        if(nowpos==wsize) return nowpos;        for(auto d: dr){            int newrow = row + d[0], newcol = col + d[1];            if(newrow<0||newrow>=rows||newcol<0||newcol>=cols||passed[newrow][newcol]) continue;            passed[row][col] = true;            if(dfsrecurtive(board, newrow, newcol, rows, cols, nowpos, word, passed,wsize)==wsize) return wsize;            passed[row][col] = false;        }        return -1;    }  private:    vector<vector<int>> dr{{0, -1}, {-1, 0}, {0, 1}, {1, 0}}; //代表四个方向,左上右下};
原创粉丝点击