Leetcode, WordSearch
#include <iostream>
#include <vector>
using namespace std;
bool dfs( const vector<vector<char>> &board, const string &word, int index,
int x, int y, vector<vector<bool>> &visited)
{
//收敛条件
if (index == word.size())
return true;
if (x < 0 || y < 0 || x >= board.size() || y >= board[0].size())
return false;
if (visited[x][y]) return false;
if (board[x][y] != word[index]) 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;
}
// 时间复杂度 O(n^2*m^2),空间复杂度 O(n^2)
bool solution(vector<vector<char>> &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;
}
int main()
{
vector<vector<char>> board = { {'a','b','c','e'},
{'s','f','c','s'},
{'a','d','e','e'} };
cout << solution(board, "abcced") << endl; //true
cout << solution(board, "see") << endl; //true
cout << solution(board, "abcb") << endl; //false
return 0;
}