Home Word Search
Post
Cancel

LeetCode #79: Word Search (C/C++).

medium

source: https://leetcode.com/problems/word-search/
C/C++ Solution to LeetCode problem 79. Word Search.

Problem


Given an m x n grid of characters board and a string word, return true if word exists in the grid.

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

Examples


Example 1:

Input: board = [[“A”,”B”,”C”,”E”],[“S”,”F”,”C”,”S”],[“A”,”D”,”E”,”E”]], word = “ABCCED”
Output: true

Example 2:

Input: board = [[“A”,”B”,”C”,”E”],[“S”,”F”,”C”,”S”],[“A”,”D”,”E”,”E”]], word = “SEE”
Output: true

Example 3:

Input: board = [[“A”,”B”,”C”,”E”],[“S”,”F”,”C”,”S”],[“A”,”D”,”E”,”E”]], word = “ABCB”
Output: false

Constraints


  • m == board.length
  • n = board[i].length
  • 1 <= m, n <= 6
  • 1 <= word.length <= 15
  • board and word consists of only lowercase and uppercase English letters.

Follow up: Could you use search pruning to make your solution faster with a larger board?

Solution


This one is easily solved using DFS/Backtracking.

  • For every cell we verify if at an index that letter matches to the letter at word.
    • If not, we return false.
    • If matches, we increment index and look to the next character (calling recursively our method for the next character to the left, right, top, bottom) to the current one.
  • Once we matched all letters, we return true.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class Solution {
  vector<vector<bool>> visited;
  string word;

  bool solve(vector<vector<char>>& board, int index, int r, int c) {
    if (index == word.size())
      return true;
    if (r >= board.size() || c >= board[r].size() || r < 0 || c < 0)
      return false;
    if (visited[r][c])
      return false;

    if (board[r][c] != word[index])
      return false;
    
    visited[r][c] = true;
    bool exists = solve(board, index + 1, r + 1, c);
    exists |= solve(board, index + 1, r, c + 1);
    exists |= solve(board, index + 1, r - 1, c);
    exists |= solve(board, index + 1, r, c - 1);
    visited[r][c] = false;

    return exists;
  }

public:
  bool exist(vector<vector<char>>& board, string word) {
    visited = vector(board.size(), vector<bool>(board[0].size(), false));
    this->word = word;

    for(int r=0; r<board.size(); r++) {
      for (int c=0; c<board[0].size(); c++) {
        if (solve(board, 0, r, c))
          return true;
      }
    }

    return false;
  }
};
This post is licensed under CC BY 4.0 by the author.

Subsets

Longest Subarray of 1's After Deleting One Element