题解 | #牛群定位系统#

牛群定位系统

https://www.nowcoder.com/practice/d808aaa4c13c4d38bff333aa796e6a1e

知识点:

DFS/回溯

分析:

我们可以使用回溯算法来解决这个问题。我们从二维牛群定位系统的每个单元格开始,然后通过相邻的单元格递归搜索,构建牛名。如果构建的牛名在单词列表中,则将其添加到结果中。

具体步骤如下:

1. 遍历二维牛群定位系统的每个单元格:

- 对于每个单元格,以该单元格为起点,分别向上、下、左、右四个方向进行深度优先搜索(DFS)。

- 搜索的路径就是构建的牛名。

- 在搜索过程中,需要判断当前构建的牛名是否在单词列表中,如果在则将其添加到结果中。

2. 使用一个集合来存储结果,保证结果中的牛名不重复,并按照在单词列表中出现的顺序进行排序。

3. 返回结果。

编程语言:

C++

ACcode:完整代码

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param board char字符型vector<vector<>>
     * @param words string字符串vector
     * @return string字符串vector
     */
    vector<string> findWords(vector<vector<char> >& board, vector<string>& words) {
        std::unordered_set<std::string> result;

        int m = board.size();
        int n = board[0].size();

        for (const std::string& word : words) {
            // 遍历二维牛群定位系统的每个单元格
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    std::vector<std::vector<bool>> visited(m, std::vector<bool>(n, false));
                    // 以每个单元格为起点进行深度优先搜索
                    if (dfs(board, i, j, word, 0, visited)) {
                        result.insert(word);
                    }
                }
            }
        }

        std::vector<std::string> sorted_result;
        for (const std::string& word : words) {
            if (result.count(word) > 0) {
                sorted_result.push_back(word);
            }
        }

        // 按照在单词列表中的顺序进行排序
        std::sort(sorted_result.begin(),
        sorted_result.end(), [&words](const std::string & a, const std::string & b) {
            return std::find(words.begin(), words.end(), a) < std::find(words.begin(),
                    words.end(), b);
        });

        return sorted_result;
    }

  private:
    bool dfs(std::vector<std::vector<char>>& board, int row, int col,
             const std::string& word, int index, std::vector<std::vector<bool>>& visited) {
        if (index == word.length()) {
            return true;
        }

        if (row < 0 || row >= board.size() || col < 0 || col >= board[0].size() ||
                visited[row][col] || board[row][col] != word[index]) {
            return false;
        }

        visited[row][col] = true;

        bool found = dfs(board, row + 1, col, word, index + 1, visited) ||
                     dfs(board, row - 1, col, word, index + 1, visited) ||
                     dfs(board, row, col + 1, word, index + 1, visited) ||
                     dfs(board, row, col - 1, word, index + 1, visited);

        visited[row][col] = false;

        return found;
    }
};

全部评论

相关推荐

CrazyBucket:我今天下午也做梦在招聘会上面试一家小厂,给自己气笑了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务