2019独角兽企业重金招聘Python工程师标准>>>

问题:

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 =

[['A','B','C','E'],['S','F','C','S'],['A','D','E','E']
]

word = "ABCCED", -> returns true,
word = "SEE", -> returns true,
word = "ABCB", -> returns false.

解决:

【题意】题目要求在字母矩阵中,可以上下左右移动,看是否可以得到给定的字符串,同一位置的字符串只能使用一次。

① 使用dfs遍历。向上下左右四个方向移动。

class Solution{//10ms
    public boolean exist(char[][] board, String word) {
        int m = board.length;
        int n = board[0].length;
        boolean res = false;
        for(int i = 0; i < m; i ++){
            for(int j = 0; j < n; j ++){
               if(dfs(board,word,i,j,0)){
                   res = true;
               }
            }
        }    
        return res;
    }     
    public boolean dfs(char[][] board, String word, int i, int j, int k){
        int m = board.length;
        int n = board[0].length;
        if(i < 0 || j < 0 || i >= m || j >= n){
            return false;
        }  
        if(board[i][j] == word.charAt(k)){
            char tmp = board[i][j];//记录当前位置
            board[i][j] = '#';//该位置已经被使用
            if(k == word.length() - 1){//匹配完毕
                return true;
            }else if(dfs(board, word, i - 1, j, k + 1)
            || dfs(board, word, i + 1, j, k + 1)
            || dfs(board, word, i, j - 1, k + 1)
            || dfs(board, word, i, j + 1, k + 1)){//遍历上下左右四个方向
                return true;
            }
            board[i][j] = tmp;//还原
        }     
        return false;
    }
}

class Solution {//14ms
    public boolean exist(char[][] board, String word) {
        for(int i = 0; i < board.length; i ++)
            for(int j = 0; j < board[0].length; j ++){
                if(dfs(board, word, i, j, 0))
                    return true;
            }
        return false;
    }
    private boolean dfs(char[][] board, String word, int i, int j, int k){
        if(k == word.length()) return true;
        if(i > board.length-1 || i <0 || j<0 || j >board[0].length - 1 || board[i][j] != word.charAt(k))
            return false;
        board[i][j] = '#';//改变该位置的值
        boolean flag =    dfs(board, word, i - 1, j, k + 1) ||
                            dfs(board, word, i, j - 1, k + 1) ||
                            dfs(board, word, i, j + 1, k + 1) ||
                            dfs(board, word, i + 1, j, k + 1);//遍历上下左右四个方向
        board[i][j] = word.charAt(k);//还原
        return flag;
    }
}

② 在discuss中看到,对处理已遍历的字符的处理方法不同。

class Solution {//9ms
    public boolean exist(char[][] board, String word) {
        int n = board.length, m = board[0].length;
        if (word.length() > n * m)  return false;
        for (int i = 0; i < n; i++){
            for (int j = 0; j < m; j++){
                if (dfs(board, word, i, j, 0))
                    return true;
            }
        }
        return false;
    }
    private boolean dfs(char[][] board, String word, int i, int j, int k){
        if (k == word.length()) return true;
        if (i < 0 || i == board.length || j < 0 || j == board[0].length)
            return false;
        if (board[i][j] != word.charAt(k))  return false;
        board[i][j] ^= 256;//改变该位置的值,将其变为非字母
        boolean flag = dfs(board, word, i - 1, j, k + 1) || dfs(board, word, i + 1, j, k + 1) 
                    || dfs(board, word, i, j - 1, k + 1) || dfs(board, word, i, j + 1, k + 1);
        board[i][j] ^= 256; //还原该位置的值
        return flag;
    }
}

转载于:https://my.oschina.net/liyurong/blog/1538613

在矩阵中查找字符串 Word Search相关推荐

  1. 【算法 | 实验18】在字符矩阵中查找给定字符串的所有匹配项

    文章目录 题目描述 思路分析 bug记录:"error: '>>' should be '> >' within a nested template argument ...

  2. java文件中查找字符串_Java 在本地文件中查找固定字符串

    适用范围:只适用于在文本文档中查找(如,txt.java.c等等,并不适用与doc.xls等等这些文件),可嵌套文件夹.但是对中文不支持. 例如:文件夹:F:/demo 子文件夹:F:/demo/er ...

  3. 在目录下所有文件中查找字符串

    目录下的所有文件中查找字符串 find .| xargs grep -ri "class" 目录下的所有文件中查找字符串,并且只打印出含有该字符串的文件名 find .| xarg ...

  4. java 匹配最后一次出现的字符_在Java中查找字符串中字符的最后一次出现

    使用该lastIndexOf()方法在Java中查找字符串中字符的最后一次出现. 假设以下是我们的字符串.String myStr = "Amit Diwan"; 在上面的字符串中 ...

  5. hiho1482出勤记录II(string类字符串中查找字符串,库函数的应用)

    string类中有很多好用的函数,这里介绍在string类字符串中查找字符串的函数. string类字符串中查找字符串一般可以用: 1.s.find(s1)函数,从前往后查找与目标字符串匹配的第一个位 ...

  6. 在Python中查找字符串长度

    介绍 (Introduction) In this tutorial, we are going to discuss how we can find string length in Python. ...

  7. java字符串字符排列组合_如何在Java中查找字符串的所有排列

    java字符串字符排列组合 In this tutorial, we will learn how to find the permutation of a String in a Java Prog ...

  8. c语言找字符串的位置,C语言开发中查找字符串位置的方法

    C语言开发中,我们可以使用strstr函数找到字符串,程序员在这个时候要怎么操作呢?别着急,今天是爱站技术频道小编为大家介绍的C语言开发中查找字符串位置的方法,一起参考看看吧! C语言strchr() ...

  9. mysql逗号分隔正则查询_正则表达式在逗号分隔的列表中查找字符串和下一个字符-MySQL?...

    要搜索以逗号分隔的列表,请使用MySQL find_in_set().这里不需要为此使用正则表达式.语法如下-select *from yourTableName where find_in_set( ...

最新文章

  1. Yolo模型部署的两种方法
  2. RNN(Recurrent Neural Network)的几个难点
  3. 语义化,让你的网页更好的被搜索引擎理解
  4. tfs文件系统之NS配置管理
  5. ChaiNext:多空胶着
  6. jQuery.extend()、jQuery.fn.extend()扩展方法具体解释
  7. java面试题2018带答案_java面试题及答案下载
  8. 登录 Jed_SH ELK 默认端口
  9. Hook 迅游手游加速器
  10. 微信小程序-云开发3云函数、云存储
  11. Dynamical Isometry and a Mean Field Theory of CNNs
  12. 删除文件夹时,报错“错误ox80070091:目录不是空的”,该如何解决?
  13. 王者荣耀游戏英文及翻译
  14. SQL相关知识点(一)
  15. 中科院基于gpt的学术优化网站搭建教程
  16. 完美立方生理周期假币熄灯阶乘汉诺塔N皇后
  17. 如何在 BGP 中通告网络
  18. Python 绘制隐函数图像
  19. JSAAS开源社区版
  20. 【从零开始数学建模(1)】第一章 建立数学模型~导论

热门文章

  1. 一些SqlServer常见和入门操作
  2. 图解C# Console 输出和Console相关编程复习总结
  3. 设置 页面 内容并排平均显示
  4. 树、森林与二叉树的相互转换
  5. C# web api 中过滤器的使用
  6. 启动MySQL数据库时找不到mysqld.sock的解决办法!
  7. 【HDU】5256 系列转换(上涨时间最长的序列修饰)
  8. arma找不到合适的模型_新手自学PS找不到合适的素材?5000高清背景素材+150G素材包+滤镜...
  9. 权重可以当做概率幅吗?---用神经网络的收敛模拟机械波的波动
  10. 3*3卷积核 5*5卷积核到底有多大区别