word search
interview 1unknown
c_cpp
3 years ago
2.2 kB
2
Indexable
/* n*n, n<=6; w<=15 T(n,w) <= n*n*3^(w-1) == 36*3^14 = 60000 * 81 * 36 <= 10^8 * 2 for i : for j : int w_i = 0 // next letter in w to be matched if w[w_i] == grid[i][j] : bool 2-D array vis : init to false vis[i][j] = true dfs(vis, grid, i, j, w_i + 1) bool dfs(&vis, &grid, i, j, w_i) : if w_i == w.length : return true bool ret = false check all neighbours (in,jn) of (i,j) : if w[w_i] == grid[in][jn] && vis[in][jn] == false: vis[in][jn] = true ret |= dfs(vis, grid, in, jn, w_i + 1) vis[in][jn] = false return ret */ class Solution { public: int di[4] = {1,0,-1,0}; int dj[4] = {0,1,0,-1}; //down,up,left,right bool dfs(vector<vector<char>>& board, vector<vector<bool>>& visited, string& word, int par_i, int par_j, int word_counter) { if (word_counter == word.size()) { return true; } bool found = false; for (int d = 0; d < 4; d++) { int i = par_i + di[d]; int j = par_j + dj[d]; if (i >= 0 and i < board.size() and j >=0 and j < board[0].size() and word[word_counter] == board[i][j] and !visited[i][j]) { visited[i][j] = true; found |= dfs(board, visited, word, i, j, word_counter + 1); visited[i][j] = false; } } return found; } bool exist(vector<vector<char>>& board, string word) { int n = board.size(); if (n == 0) { return word.empty(); } int m = board[0].size(); if (m == 0) { return word.empty(); } int w_i = 0; vector<vector<bool>> visited(n, vector<bool>(m, false)); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (word[w_i] == board[i][j]) { visited[i][j] = true; if (dfs(board, visited, word, i, j, w_i + 1)) { return true; } visited[i][j] = false; } } } return false; } };
Editor is loading...