Word Search 和 Word Search Ⅱ

Word Search 和 Word Search Ⅱ

Word Search

Given a 2D board and a word, find if the word exists in the grid.

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

For example,
Given board =

[
  ["ABCE"],
  ["SFCS"],
  ["ADEE"]
]
word = "ABCCED", -> returns true,
word = "SEE", -> returns true,
word = "ABCB", -> returns false.

题目意思:在矩阵中查找给定单词,如在

["ABCE"],
  ["SFCS"],
  ["ADEE"]

中,查找ABCCED,此时可以找到,返回true

思路:利用回溯,定义一个二维数组dp[][],dp[i][j]表示单词在i,j点经过。从[0,0]开始,如果匹配,则往上下左右四个方向继续进行剩下的查找,直到找到完整的单词


class Solution {
public:
    bool exist(vector<vector<char> > &board, string word) {

        if(word.length()==0)
        {
            return false;
        }
       const int m = board.size();
        const int n = board[0].size();
        vector<vector<bool> > vivisted(m, vector<bool>(n, false));
        int index=0;
        for(int i=0;i<board.size();i++)
        {
            for(int j=0;j<board[0].size();j++)
            {
                if(board[i][j]==word[0])

                {
                    vivisted[i][j]=true;
                    if(index==word.size()-1||dfsserach(board,word,index+1,i,j,vivisted))
                    {
                        return true;
                    }
                    vivisted[i][j]=false;
                }
            }
        }
        return false;

    }

    bool dfsserach(vector<vector<char>> &board,string word,int index,int i,int j, vector<vector<bool>> &vivisted)
    {
        if(index==word.size()){
            return true;
        }

        int  direction[4][2]={-1,0,0,1,1,0,0,-1};

        int k;
        for(k=0;k<4;k++)
        {
            int ii=i+direction[k][0];
            int jj=j+direction[k][1];

            if(ii>=0&&ii<board.size()&&jj>=0&&jj<board[0].size()&&board[ii][jj]==word[index]&&vivisted[ii][jj]==false)
            {
                vivisted[ii][jj]=true;
                if(index==word.size()-1||dfsserach(board,word,index+1,ii,jj,vivisted))
                {
                    return true;
                }
                vivisted[ii][jj]=false;
            }
        }

        return false;
    }

};

Word SearchⅡ

Given a 2D board and a list of words from the dictionary, find all words in the board.

Each word must be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once in a word.

For example,
Given words = ["oath","pea","eat","rain"] and board =

[
  [‘o‘,‘a‘,‘a‘,‘n‘],
  [‘e‘,‘t‘,‘a‘,‘e‘],
  [‘i‘,‘h‘,‘k‘,‘r‘],
  [‘i‘,‘f‘,‘l‘,‘v‘]
]
Return ["eat","oath"].

题目意思是要在给定的矩阵中查找出现在单词字典中单词,如上面的eat和oath在 矩阵中可以找到

思路:构建字典树,把字典中的单词,创建成字典树,Insert方法重要


 struct TrieNode
    {
        TrieNode *child[26];
        string node;
        TrieNode():node("")
        {
            for(auto &a:child)
                a=NULL;
        }
    };
    struct Trie
    {
        TrieNode *root;
        Trie():root(new TrieNode()){}
        void insert(string s)
        {
            TrieNode *p=root;
            for(auto &str:s)
            {
                int i=str-‘a‘;
                if(!p->child[i])
                {
                    p->child[i]=new TrieNode();

                }
                p=p->child[i];
            }
            p->node =s;
        }

    };

构建好字典树之后,根据字母矩阵,然后往字典树中进行查找,时间复杂度N2 *O(字典查找)

代码如下


 for(int i=0;i<board.size();i++)
        {
            for(int j=0;j<board[0].size();j++)
            {
                if(T.root->child[board[i][j]-‘a‘])
                {
                    dp[i][j]=true;//表示当前 节点 已经走过
                    WordSearch(board,T.root->child[board[i][j]-‘a‘],i,j,dp,result);
                    dp[i][j]=false;//去掉走过的痕迹
                }
            }
        }

总代码如下:


class Solution {
public:

    struct TrieNode
    {
        TrieNode *child[26];
        string node;
        TrieNode():node("")
        {
            for(auto &a:child)
                a=NULL;
        }
    };
    struct Trie
    {
        TrieNode *root;
        Trie():root(new TrieNode()){}
        void insert(string s)
        {
            TrieNode *p=root;
            for(auto &str:s)
            {
                int i=str-‘a‘;
                if(!p->child[i])
                {
                    p->child[i]=new TrieNode();

                }
                p=p->child[i];
            }
            p->node =s;
        }

    };
    vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {

        vector<string> result;
        if(board.empty()||board[0].empty()||words.empty())
            return result;

        vector<vector<bool>> dp(board.size(),vector<bool>(board[0].size(),false));
        Trie T;
        for(auto &s:words)
            T.insert(s);

        for(int i=0;i<board.size();i++)
        {
            for(int j=0;j<board[0].size();j++)
            {
                if(T.root->child[board[i][j]-‘a‘])
                {
                    dp[i][j]=true;//表示当前 节点 已经走过
                    WordSearch(board,T.root->child[board[i][j]-‘a‘],i,j,dp,result);
                    dp[i][j]=false;//去掉走过的痕迹
                }
            }
        }

        return result;
    }

    void WordSearch(vector<vector<char>>& board,TrieNode *p,int i,int j,vector<vector<bool>> &dp,vector<string> &result)
    {
        if(!p->node.empty())//如果当前字典树位于Node处,表示有单词,找到一次,将该单词处的标记清除,继续往下找
        {
            result.push_back(p->node);
            p->node.clear();
        }
        int  direction[4][2]={-1,0,0,1,1,0,0,-1};//定义四个方向

       for(int k=0;k<4;k++)
       {
           int new_i=i+direction[k][0];  //新的i
           int new_j=j+direction[k][1]; //新的j

           //跟上面同样的思想,把新的节点看成当前节点继续往前查找
           if(new_i>=0&&new_i<board.size()&&new_j>=0&&new_j<board[0].size()&&dp[new_i][new_j]==false&&p->child[board[new_i][new_j]-‘a‘])
           {
               dp[new_i][new_j]=true;
               WordSearch(board,p->child[board[new_i][new_j]-‘a‘],new_i,new_j,dp,result);
               dp[new_i][new_j]=false;
           }
       }
    }
};

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-03 09:32:22

Word Search 和 Word Search Ⅱ的相关文章

SharePoint Search之(十)Search Webpart-搜索网页部件

除了SharePoint提供的搜索框和结果页面,我们如何能够快速定义自己的搜索页面呢?SharePoint 2013 提供了一系列的Search Webpart,来方便定制search 页面.本文将介绍常用的和search相关的web part. 在Site collection home页面,点击Settings, add a new page,在弹出的页面里填入新页面的名字: 页面打开之后自动进入编辑模式,在ribbon上点击insert webpart: 在Content rollup,S

利用模板导出文件(二)之jacob利用word模板导出word文件(Java2word)

先下载jacob.jar包. 解压后将jacob.dll放到windows/system32以下或\jre\bin以下. 将jacob.jar增加项目. 这样项目的环境基本上搭建完毕,接下来就是书写相关的代码: /** * 传入数据为HashMap对象,对象中的Key代表word模板中要替换的字段.Value代表用来替换的值. * word模板中全部要替换的字段(即HashMap中的Key)以特殊字符开头和结尾. * 如:$code$.$date$--.以免执行错误的替换. * 全部要替换为图片

POI 读取word (word 2003 和 word 2007) (转)

最近在给客户做系统的时候,用户提出需求,要能够导入 word 文件,现在 microsoft word 有好几个版本 97.2003.2007的,这三个版本存储数据的格式上都有相当大的差别,而现在 97 基本上已经退出市场,几乎没有人用这个版本了, 所以在我们的系统中只考虑 2003 版本和 2007 版本的,因为我们只要求能够读取 word 中的文字内容即可,其中的文字样式.图片等信息可以忽略,也不用直接操作 word 文件, 所以我们选择 用 apache 的 POI 进行读取. 读取 20

Comparing randomized search and grid search for hyperparameter estimation

Comparing randomized search and grid search for hyperparameter estimation Compare randomized search and grid search for optimizing hyperparameters of a random forest. All parameters that influence the learning are searched simultaneously (except for

C#,WPF使用word模板导出word文档

使用word模板导出word文档,首先需要在word模板中插入书签: 根据创建的书签名和位置,将需要写入的内容插入到word文件中. 需要引用  Microsoft.Office.Interop.Word;在添加引用-程序集中搜索可以找到. using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Windows; usin

使用jacob合并多个word为单个word

1导入jar  包,我使用的是1.7,dil文件一定要和jar包匹配 使用前操作    1.把dll文件放在%JAVA_HOME%\bin下(注意系统是32位还是64位),    也可以放在C:\Windows\System32下,如果是64位应该放在C:\Windows\SysWOW64 下.建议放在jdk的bin目录下    2.如果是在eclipse下开发,需要重新引入jdk(Preference/Java/Installed JREs)    3.开发时将jacab.jar包放在项目li

【jacob word】使用jacob,合并多个word为一个word文件

将几个word文件合并到一个word文件,使用注意点: 1.后面附项目运用的jar包jacob-1.9, 2.并且jacob运用中,需要将附件内的jacob.dll放到windows/system32下 语法介绍: 将一个关于JACOB的代码分成下面几个步骤: 1) ActiveXComponent ax = new ActiveXComponent("a1")://构建ActiveX组件实例 其中的a1的值和你需要调用的ActiveX控件有关 MS控件名 a1的值 InternetE

【起航计划 032】2015 起航计划 Android APIDemo的魔鬼步伐 31 App-&gt;Search-&gt;Invoke Search 搜索功能 Search Dialog SearchView SearchRecentSuggestions

Search (搜索)是Android平台的一个核心功能之一,用户可以在手机搜索在线的或是本地的信息.Android平台为所有需要提供搜索或是查询功能的应用提 供了一个统一的Search Framework来帮助实现Search功能.Search Framework的UI可以有两种形式: 屏幕顶部的Search Dialog:如Google Map提供的搜索条. 可以嵌到ContentView中的SearchView,应用可以将它放在屏幕上任何地方. 不管采用那种UI,Android系统都可以通

79. Word Search/212. Word Search II--图的back tracking -- tier tree 待续

79题, 给你一个二维的board, 只能往上下左右四个方向走,为你是否能找到单词. board = [ ['A','B','C','E'], ['S','F','C','S'], ['A','D','E','E'] ] Given word = "ABCCED", return true. Given word = "SEE", return true. Given word = "ABCB", return false. 分析: 算法并不难,