首页 > 其他分享 >212. 单词搜索 II(字典树/前缀树)

212. 单词搜索 II(字典树/前缀树)

时间:2022-11-22 21:33:15浏览次数:53  
标签:212 前缀 Trie II int board words child word

给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words, 返回所有二维网格上的单词 。

单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。

 

示例 1:

输入:board = [["o","a","a","n"],["e","t","a","e"],["i","h","k","r"],["i","f","l","v"]], words = ["oath","pea","eat","rain"]
输出:["eat","oath"]

示例 2:

输入:board = [["a","b"],["c","d"]], words = ["abcb"]
输出:[]

 

提示:

  • m == board.length
  • n == board[i].length
  • 1 <= m, n <= 12
  • board[i][j] 是一个小写英文字母
  • 1 <= words.length <= 3 * 104
  • 1 <= words[i].length <= 10
  • words[i] 由小写英文字母组成
  • words 中的所有字符串互不相同

 

字典树/前缀树,模板题。最初版本见题号208,实现字典树。进阶如题号472,字典树+dfs记忆化搜索这类。

class Solution {
public:
struct Trie
{
    Trie* child[26];
    string word = "";
    Trie() {
        for (int i = 0; i < 26; i++)
            child[i] = nullptr;
    }
};
    vector<string> ans;
    
    void dfs(vector<vector<char>>& board,Trie* t,int i,int j)
    {
        char c=board[i][j];
        if(c=='*'||t->child[c-'a']==nullptr) return;
        t=t->child[c-'a'];
        if(t->word!="")
        {
            ans.push_back(t->word);
            t->word="";
        }
        board[i][j]='*';
        if(i+1<board.size())dfs(board,t,i+1,j);
        if(i-1>=0)dfs(board,t,i-1,j);
        if(j+1<board[i].size())dfs(board,t,i,j+1);
        if(j-1>=0)dfs(board,t,i,j-1);
        board[i][j]=c;
        return;
    }
    vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
        Trie* t=new Trie();
        for(int i=0;i<words.size();i++)
        {
            Trie* cur=t;
            for(int j=0;j<words[i].size();j++)
            {
                if(cur->child[words[i][j]-'a']==nullptr)
                {
                    cur->child[words[i][j]-'a']=new Trie();
                }
                cur=cur->child[words[i][j]-'a'];
            }
            cur->word=words[i];
        }
       
        for(int i=0;i<board.size();i++)
        {
            for(int j=0;j<board[i].size();j++)
            {
                dfs(board,t,i,j);
            }
        }
        return ans;
    }
};

 

标签:212,前缀,Trie,II,int,board,words,child,word
From: https://www.cnblogs.com/zzzlight/p/16916517.html

相关文章

  • AXI iic使用
    本文主要讲述zynq的iic使用,iic作为主站使用,作为从站的本文不适合。Iic的接口在PL端。(iic的接口在ps端的情况下,不适合本文)如果iic的接口在ps端,请看:https://blog.csdn.net/......
  • 2022NOIP A层联测33 GCD 简单题 建筑 树上前缀和
    T1:[图论/枚举]给出有边权无向图,边权保证互不相同,Q次询问从S到T的路径中,边权的gcd最大是多少。(n<=1e4,Q<=2e5,w<=1e6)考场根据之前的一道图论题经验,在最短路上加个“\(w......
  • 如何在windows 2008 IIS7 上实现AD域的访问控制
    1、服务器加入域2、创建点站3、对站站进行设置3.1设置网站的连接模式选中站点,在控制台右侧选择基本设置=》选择应用程序用户3.2开启访问模式选......
  • IIS服务没有Windows身份验证
    解决方法:1.打开C:\Windows\servicing\Packages,查找文件Microsoft-Windows-IIS-WebServer-AddOn-2-Package~31bf3856ad364e35~amd64~~10.0.19041.964.mum(注意一定要加上后......
  • 搭建IIS网站后,点击浏览地址,报403错误
    点击左侧的浏览地址,报右侧的错误,可将目录浏览进行启用双击进去,进行启用即可  ......
  • Vulnhub之Hackable II靶机详细解题过程
    HackableII作者:Jason_huawen靶机基本信息名称:Hackable:II地址:https://www.vulnhub.com/entry/hackable-ii,711/识别目标主机IP地址┌──(kali㉿kali)-[~/Vulnhub......
  • 16进制对应的ASCII表
      ASCII控制字符二进制十进制十六进制缩写可以显示的表示法名称/意义00000000000NUL␀空字符(Null)00000001101SOH␁标题开始00000010202STX␂本文开始00000011303E......
  • 换行、回车、空格等常用的ASCII码值
    换行符的ASCII码值为10,十六进制表示为0x0A回车符的ASCII码值为13,十六进制表示为0x0D空格符的ASCII码值为32,十六进制表示为0x20以下列出其他一些常用到的符号的ASCII码......
  • leetcode680-验证回文串 II。方法有缺陷,还需要继续琢磨
    680.验证回文串II这个做法就是利用双指针。一个指向第一个字符,一个指向最后一个字符。遇到两个指针指向的字符相同时,一个往前走,一个往后走。如果遇到不相同,那么就看看......
  • TM4C123G学习记录(4)--关于ROM前缀函数和HWREG函数
    为了准备电赛临时学一下TM4C123G,简单记录学习内容大家可以在​​这里​​下载我收集的资源,非常全面,花了很大功夫收集来的,还有书籍、例程代码等还可以在TI官网下载相关文档​......