返回轨道
算法 · 2026-05-14 · 22 阅读

P117 搜索单词

算法 22 阅读

信号摘要

难度:Medium · 时长:07:51 · leetcode 79 · lintcode 123

P117 搜索单词

未对外公开播放权限
点击查看说明

描述

这个题目说的是,给你一个二维字符矩阵和一个单词,矩阵中的字符可以和它上/下/左/右的字符连接起来形成单词,并且每个位置的字符不能重复使用。你要判断给你的单词是否存在于字符矩阵中。

比如说,给你的字符矩阵是:

a, a, c, b i, r, a, r b, e, y, r

给你的单词是 car。car 存在于字符矩阵中,因此返回 true。

如果给你的单词是 cab,cab 不存在于字符矩阵中,因此返回 false。

代码

public class AlgoCasts {

  private boolean exist(char[][] board, boolean[][] visited, int i, int j,
                        String word, int idx) {
    if (idx == word.length()) return true;
    if (i < 0 || i >= board.length || j < 0 || j >= board[0].length ||
      visited[i][j] || board[i][j] != word.charAt(idx))
      return false;
    visited[i][j] = true;
    boolean existed = exist(board, visited, i-1, j, word, idx+1) ||
      exist(board, visited, i+1, j, word, idx+1) ||
      exist(board, visited, i, j-1, word, idx+1) ||
      exist(board, visited, i, j+1, word, idx+1);
    visited[i][j] = false;
    return existed;
  }

  // Time: O(m*n*3^k), Space: O(m*n)
  public boolean exist(char[][] board, String word) {
    if (board == null || board.length == 0 ||
      board[0] == null || board[0].length == 0)
      return false;
    int m = board.length, n = board[0].length;
    boolean[][] visited = new boolean[m][n];
    for (int i = 0; i < m; ++i) {
      for (int j = 0; j < n; ++j) {
        if (exist(board, visited, i, j, word, 0))
          return true;
      }
    }
    return false;
  }

}

📡 通讯频道