Leetcode:Word Search

来源:互联网 发布:双色球软件2016破解版 编辑:程序博客网 时间:2024/06/06 07:23

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 =

[
  ["ABCE"],
  ["SFCS"],
  ["ADEE"]
]
word = "ABCCED", -> returns true,
word = "SEE", -> returns true,
word = "ABCB", -> returns false.


解法: 类似于迷宫,递归回溯。需要一个辅助数组记录走过的位置,防止同一个位置被使用多次。

#include<set>#include<vector>#include<iostream>using namespace std;bool dfs(const vector<string> &board, const string &word, int index, int x, int y, vector<vector<bool> > &visited);bool exist(vector<string > &board, string word) {    const int m = board.size();    const int n = board[0].size();    vector<vector<bool> > visited(m, vector<bool>(n, false));    for (int i = 0; i < m; ++i)        for (int j = 0; j < n; ++j)            if (dfs(board, word, 0, i, j, visited))                  return true;                return false;}bool dfs(const vector<string> &board, const string &word, int index, int x, int y, vector<vector<bool> > &visited){    if (index == (int)word.size())        return true; // 收敛条件    if (x < 0 || y < 0 || x >= (int)board.size() || y >= (int)board[0].size())        return false; // 越界,终止条件        if(word[index]!=board[x][y] || visited[x][y])  //判断是否相等,同时防止越界。对于s=ABCB ,在寻找的过程中不能当走到s1=ABCE的C时,再往回走到B        return false;    visited[x][y] = true;    bool ret =  dfs(board, word, index + 1, x - 1, y, visited) || // 上                dfs(board, word, index + 1, x + 1, y, visited) || // 下                dfs(board, word, index + 1, x, y - 1, visited) || // 左                dfs(board, word, index + 1, x, y + 1, visited); // 右    visited[x][y] = false;    return ret;}int main(){    string  s1="ABCE";    string  s2="SFCS";    string  s3="ADEE";    string  s ="ABCB";    vector<string> board;    board.push_back(s1);    board.push_back(s2);    board.push_back(s3);    bool result = exist(board, s) ;    cout<<result<<endl;    return 0;}


0 0