LeetCode-212-word-search-ii(单词搜索 II)

本文介绍了一种利用字典树(Trie)解决LeetCode上‘单词搜索II’问题的方法。首先,将输入的单词列表构建为Trie树,然后通过深度优先搜索(DFS)遍历二维字符矩阵,寻找匹配的单词。当找到一个匹配的单词时,将其添加到结果列表中。最后返回所有找到的单词。这种方法在数据规模较小的情况下效率较高。
摘要由CSDN通过智能技术生成

题目内容

题目链接: https://leetcode-cn.com/problems/word-search-ii

Given an m x n board of characters and a list of strings words, return all words on the board.

Each word must 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 in a word.

在这里插入图片描述

Input: board = [[“o”,“a”,“a”,“n”],[“e”,“t”,“a”,“e”],[“i”,“h”,“k”,“r”],[“i”,“f”,“l”,“v”]], words = [“oath”,“pea”,“eat”,“rain”]
Output: [“eat”,“oath”]

分析

看到这样的字符串查找、搜索,能想到字典树Trie,这道题目的数据规模不大,所以可以先将字符串words插入到字典树中,然后暴力DFS搜索整个board

代码

class Solution {
public:

    int son[100000][26] = {0}, cnt[100000] = {0}, idx = 0;
    int dis[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    vector<string> res;
    vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
        // 将word插入到字典树中
        for (auto word: words) insert(word);

        for (int i = 0; i < board.size(); i ++)
            for (int j = 0; j < board[0].size(); j ++)
                dfs(0, i, j, board, "");
        return res;
    }
	// 全文背诵y总的模板,
    void insert(string str) {
        int p = 0;
        for (auto c: str)
        {
            int o = c - 'a';
            if(!son[p][o]) son[p][o] = ++ idx;
            p = son[p][o];
        }
        cnt[p] ++;
    }

	// 暴力搜索
    void dfs(int p, int i, int j, vector<vector<char>>& b, string s) {
    	// 越界直接return
        if (i < 0 || j < 0 || i >= b.size() || j >= b[0].size()) return ;
        
        char c = b[i][j]; 
        int o = c - 'a';// 计算偏移量
        // 如果该点已经走过了,或者该Trie中没有该点,直接return
        if (c == '1' || !son[p][o])return ;
        // 运行到这里,说明Trie中含有该点(即son[p][o]!=0)
        p = son[p][o];
        // 若cnt不等0,则说明Tire中有s+c这个字符串,加入到res之后,将cnt置为0即可。
        if (cnt[p]) res.push_back(s + c), cnt[p] = 0;
		// 该点已经被用过了,所以标记一下
        b[i][j] = '1';
        for (int k = 0; k < 4; k ++)
        	// 4个方向dfs
            dfs(p, i + dis[k][0], j + dis[k][1], b, s + c);
        // 恢复该点,便于下一次dfs
        b[i][j] = c;
    }
};
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Honyelchak

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值