Go Java算法之单词搜索示例详解

 更新时间:2022年08月23日 10:18:30   作者:黄丫丫  
这篇文章主要为大家介绍了Go Java算法之单词搜索示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

单词搜索

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

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

  • 示例 1:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"

输出:true

  • 示例 2:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"

输出:true

  • 示例 3:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB"

输出:false  

提示:

  • m == board.length
  • n = board[i].length
  • 1 <= m, n <= 6
  • 1 <= word.length <= 15

board 和 word 仅由大小写英文字母组成  

算法:DFS回溯(Java)

  • 以"SEE"为例,首先要选起点:遍历矩阵,找到起点S。
  • 起点可能不止一个,基于其中一个S,看看能否找出剩下的"EE"路径。
  • 下一个字符E有四个可选点:当前点的上、下、左、右。
  • 逐个尝试每一种选择。基于当前选择,为下一个字符选点,又有四种选择。
  • 每到一个点做的事情是一样的。DFS 往下选点,构建路径。
  • 当发现某个选择不对,不用继续选下去了,结束当前递归,考察别的选择。

递归的关键点

  • 关注当前考察的点,处理它,其他丢给递归子调用去做。
  • 判断当前选择的点,本身是不是一个错的点。
  • 剩下的字符能否找到路径,交给递归子调用去做。
  • 如果当前点是错的,不用往下递归了,返回false。否则继续递归四个方向,为剩下的字符选点。

那么,哪些情况说明这是一个错的点:

  • 当前的点,越出矩阵边界。
  • 当前的点,之前访问过,不满足「同一个单元格内的字母不允许被重复使用」。
  • 当前的点,不是目标点,比如你想找 E,却来到了 D。
class Solution {
    public boolean exist(char[][] board, String word) {
        if (board == null || board.length == 0) {
            return false;
        }
        boolean[][] visited = new boolean[board.length][board[0].length];
        char[] chars = word.toCharArray();
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                if (existHelper(board, visited, chars, i, j, 0)) {
                    return true;
                }
            }
        }
        return false;
    }
    private boolean existHelper(char[][] board, boolean[][] visited, char[] chars, int row, int column, int index) {
        if (index == chars.length) {
            return true;
        }
        int[][] direction = new int[][]{
                {0, 1},
                {1, 0},
                {0, -1},
                {-1, 0}
        };
        if (row >= 0 && row < board.length &&
                column >= 0 && column < board[0].length &&
                board[row][column] == chars[index] &&
                !visited[row][column]) {
            visited[row][column] = true;
            for (int[] dir : direction) {
                int newX = row + dir[0];
                int newY = column + dir[1];
                if (existHelper(board, visited, chars, newX, newY, index + 1)) {
                    return true;
                }
            }
            visited[row][column] = false;
        }
        return false;
    }
}

时间复杂度:O(M*N * 3^L)

空间复杂度:O(M*N)

算法:DFS回溯(Go)

思路同上

func exist(board [][]byte, word string) bool {
	m, n := len(board), len(board[0])
	used := make([][]bool, m)
	for i := 0; i < m; i++ {
		used[i] = make([]bool, n)
	}
	var canFind func(r, c, i int) bool
	canFind = func(r, c, i int) bool {
		if i == len(word) {
			return true
		}
		if r < 0 || r >= m || c < 0 || c >= n {
			return false
		}
		if used[r][c] || board[r][c] != word[i] {
			return false
		}
		used[r][c] = true
		canFindRest := canFind(r+1, c, i+1) || canFind(r-1, c, i+1) ||
			canFind(r, c+1, i+1) || canFind(r, c-1, i+1)
		if canFindRest {
			return true
		} else {
			used[r][c] = false
			return false
		}
	}
	for i := 0; i < m; i++ {
		for j := 0; j < n; j++ {
			if board[i][j] == word[0] && canFind(i, j, 0) {
				return true
			}
		}
	}
	return false
}

时间复杂度:O(M*N * 3^L)

空间复杂度:O(M*N)

以上就是Go Java算法之单词搜索示例详解的详细内容,更多关于Go Java算法单词搜索的资料请关注脚本之家其它相关文章!

相关文章

  • Go语言使用defer+recover解决panic导致程序崩溃的问题

    Go语言使用defer+recover解决panic导致程序崩溃的问题

    如果协程出现了panic,就会造成程序的崩溃,这时可以在goroutine中使用recover来捕获panic,进行处理,本文就详细的介绍一下,感兴趣的可以了解一下
    2021-09-09
  • golang MySQL实现对数据库表存储获取操作示例

    golang MySQL实现对数据库表存储获取操作示例

    这篇文章主要为大家介绍了golang MySQL实现对数据库表存储获取操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • golang 获取明天零点的时间戳示例

    golang 获取明天零点的时间戳示例

    今天小编就为大家分享一篇golang 获取明天零点的时间戳示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • go语言 swagger 查询 json 字段注释的示例代码

    go语言 swagger 查询 json 字段注释的示例代码

    在Go语言中,使用Swagger通过swag工具和gin-gonic框架生成API文档,涉及引入依赖、定义模型、添加注释等步骤,示例中展示了如何为接受查询参数的API端点添加注释,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • go语言中的return语句

    go语言中的return语句

    这篇文章主要介绍了go语言中的return语句,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下,希望对你的学习有所帮助
    2022-05-05
  • 详解Golang中channel的实现

    详解Golang中channel的实现

    channel俗称管道,用于数据传递或数据共享,其本质是一个先进先出的队列,使用goroutine+channel进行数据通讯简单高效,同时也线程安全,本文就给大家讲讲Golang中channel的实现,需要的朋友可以参考下
    2023-09-09
  • Go 结构体序列化的实现

    Go 结构体序列化的实现

    本文主要介绍了Go 结构体序列化的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Go日志框架zap增强及源码解读

    Go日志框架zap增强及源码解读

    这篇文章主要为大家介绍了Go日志框架zap增强及源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 详解Go语言微服务开发框架之Go chassis

    详解Go语言微服务开发框架之Go chassis

    分布式系统中每个进程的动态配置管理及运行时热加载就成为了一个亟待解决的问题。go chassis汲取了netflix的archaius框架经验,并做出来自己的创新特性。
    2021-05-05
  • golang简易令牌桶算法实现代码

    golang简易令牌桶算法实现代码

    这篇文章主要介绍了golang简易令牌桶算法实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04

最新评论