算法leetcode|79. 单词搜索(rust重拳出击)

news2024/10/3 2:20:08

文章目录

  • 79. 单词搜索:
    • 样例 1:
    • 样例 2:
    • 样例 3:
    • 提示:
    • 进阶:
  • 分析:
  • 题解:
    • rust:
    • go:
    • c++:
    • python:
    • java:


79. 单词搜索:

给定一个 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 仅由大小写英文字母组成

进阶:

  • 你可以使用搜索剪枝的技术来优化解决方案,使其在 board 更大的情况下可以更快解决问题?

分析:

  • 面对这道算法题目,二当家的再次陷入了沉思。
  • 需要尝试所有的可能,遍历是不可少的,使用循环或者递归,递归是首选,因为比较容易实现,深度优先,回溯,递归套娃大法好。
  • 需要遍历每一个元素,然后开始从每个位置使用递归套娃大法,分别向上,下,左,右四个方向进行递归,重复操作,直到匹配成功,或者匹配失败就回溯尝试其他,需要注意的是不走重复的位置,所以需要一个结构标记已经走过的位置,使用和原二维字符网格相同大小的结构比较容易,空间上应该还可以优化,但是没有深究,因为空间上并没有浪费,如果做优化,肯定是以牺牲效率为代价,所谓时间换空间,我不要换。

题解:

rust:

impl Solution {
    pub fn exist(board: Vec<Vec<char>>, word: String) -> bool {
        fn check(board: &Vec<Vec<char>>, word: &Vec<char>, idx: usize, visited: &mut Vec<Vec<bool>>, r: usize, c: usize) -> bool {
            if r >= visited.len() || c >= visited[0].len() || visited[r][c] || board[r][c] != word[idx] {
                return false;
            }
            if idx == word.len() - 1 {
                // 完全匹配
                return true;
            }
            visited[r][c] = true;
            // 上下左右递归套娃大法
            if check(board, word, idx + 1, visited, r - 1, c)
                || check(board, word, idx + 1, visited, r + 1, c)
                || check(board, word, idx + 1, visited, r, c - 1)
                || check(board, word, idx + 1, visited, r, c + 1)
            {
                return true;
            }
            visited[r][c] = false;
            return false;
        }

        let word = word.chars().collect::<Vec<_>>();
        let mut visited = vec![vec![false; board[0].len()]; board.len()];
        for r in 0..board.len() {
            for c in 0..board[0].len() {
                if check(&board, &word, 0, &mut visited, r, c) {
                    return true;
                }
            }
        }
        return false;
    }
}

go:

func exist(board [][]byte, word string) bool {
    visited := make([][]bool, len(board))
	for i := range visited {
		visited[i] = make([]bool, len(board[0]))
	}

	var check func(idx, r, c int) bool
	check = func(idx, r, c int) bool {
		if r < 0 || r >= len(board) || c < 0 || c >= len(board[0]) || visited[r][c] || board[r][c] != word[idx] {
			return false
		}
		if idx == len(word)-1 {
			// 完全匹配
			return true
		}
		visited[r][c] = true
		// 上下左右递归套娃大法
		if check(idx+1, r-1, c) || check(idx+1, r+1, c) || check(idx+1, r, c-1) || check(idx+1, r, c+1) {
			return true
		}
		visited[r][c] = false
		return false
	}

	for r, row := range board {
		for c := range row {
			if check(0, r, c) {
				return true
			}
		}
	}

	return false
}

c++:

class Solution {
private:
    bool check(vector<vector<char>>& board, string& word, int idx, vector<vector<bool>>& visited, int r, int c) {
        if (r < 0 || r >= visited.size() || c < 0 || c >= visited[0].size() || visited[r][c] || board[r][c] != word[idx]) {
            return false;
        }
        if (idx == word.size() - 1) {
            // 完全匹配
            return true;
        }
        visited[r][c] = true;
        // 上下左右递归套娃大法
        if (check(board, word, idx + 1, visited, r - 1, c)
            || check(board, word, idx + 1, visited, r + 1, c)
            || check(board, word, idx + 1, visited, r, c - 1)
            || check(board, word, idx + 1, visited, r, c + 1)) {
            return true;
        }
        visited[r][c] = false;
        return false;
    }
public:
    bool exist(vector<vector<char>>& board, string word) {
        vector<vector<bool>> visited(board.size(), vector<bool>(board[0].size(), false));

        for (int r = 0; r < board.size(); ++r) {
            for (int c = 0; c < board[0].size(); ++c) {
                if (check(board, word, 0, visited, r, c)) {
                    return true;
                }
            }
        }

        return false;
    }
};

python:

class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:
        def check(idx: int, r: int, c: int) -> bool:
            if r < 0 or r >= len(board) or c < 0 or c >= len(board[0]) or visited[r][c] or board[r][c] != word[idx]:
                return False
            if idx == len(word) - 1:
                return True
            visited[r][c] = True
            if check(idx + 1, r - 1, c) or check(idx + 1, r + 1, c) or check(idx + 1, r, c - 1) or check(idx + 1, r, c + 1):
                return True
            visited[r][c] = False
            return False

        visited = [[False] * len(board[0]) for _ in range(len(board))]
        for r in range(len(board)):
            for c in range(len(board[0])):
                if check(0, r, c):
                    return True

        return False


java:

class Solution {
    public boolean exist(char[][] board, String word) {
        boolean[][] visited = new boolean[board.length][board[0].length];

        for (int r = 0; r < board.length; ++r) {
            for (int c = 0; c < board[0].length; ++c) {
                if (check(board, word, 0, visited, r, c)) {
                    return true;
                }
            }
        }

        return false;
    }

    private boolean check(char[][] board, String word, int idx, boolean[][] visited, int r, int c) {
        if (r < 0 || r >= visited.length || c < 0 || c >= visited[0].length || visited[r][c] || board[r][c] != word.charAt(idx)) {
            return false;
        }
        if (idx == word.length() - 1) {
            // 完全匹配
            return true;
        }
        visited[r][c] = true;
        // 上下左右递归套娃大法
        if (check(board, word, idx + 1, visited, r - 1, c)
                || check(board, word, idx + 1, visited, r + 1, c)
                || check(board, word, idx + 1, visited, r, c - 1)
                || check(board, word, idx + 1, visited, r, c + 1)) {
            return true;
        }
        visited[r][c] = false;
        return false;
    }
}

非常感谢你阅读本文~
欢迎【点赞】【收藏】【评论】三连走一波~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/983029.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

提高设计效率,你还需要掌握FeatureManager这些小窍门

FeatureManager 设计树使多种选择和过滤器操作变得更为方便&#xff0c;并在处理模型时提供对多个文件夹和有用工具的访问。 FeatureManager 设计树和图形区域为动态链接。可在任一窗格中选择特征、草图、工程视图和构造几何线。 您可以分割 FeatureManager 设计树&#xff0c;…

力扣每日一题---2594. 修车的最少时间

文章目录 思路解题方法复杂度Code 思路 请注意&#xff0c;能力值越低&#xff0c;修车越快&#xff0c;应该翻译成「排名」&#xff0c;排名越靠前&#xff0c;修车越快。&#xff09;根据题意可以知道r * n * n < t 的&#xff0c;所以可以利用数学知识进行改变公式&#…

灰度变换与空间滤波

灰度变换与空间滤波 背景知识 空间域指包含图像像素的平面&#xff0c;灰度变换与空间滤波均在空间域进行&#xff0c;即直接在图像像素上操作&#xff0c;表示为 g ( x , y ) T [ f ( x , y ) ] g(x,y)T[f(x,y)] g(x,y)T[f(x,y)] &#xff0c;其中 T T T 是在点 ( x , y…

【SWT】 使 ScrolledComposite 中内容动态变化后依然可以滚动

引言&#xff1a; 在用户界面设计中&#xff0c;有时需要在有限的空间内显示大量内容。如果内容超过可视区域的大小&#xff0c;滚动功能可以帮助用户滚动并查看所有内容。本文将介绍如何使用 Eclipse SWT 库中的 ScrolledComposite 控件来实现在滚动区域中显示可滚动的标签。 …

Discuz论坛帖子标题随机高亮颜色,拒绝千篇一律!

DZ论坛帖子标题默认是没有高亮、加粗效果的&#xff0c;如果是要实现某篇帖子标题高亮、加粗&#xff0c;站长或是版主可以点开这篇帖子&#xff0c;在发帖的下方可以看到精华、高亮、图章、置顶等操作&#xff0c;然后点击高亮&#xff0c;可以选择高亮颜色&#xff0c;是否加…

直播预告 | 博睿学院 Bonree ONE接入zabbix数据源提高可观测运维能力

Zabbix是业界覆盖面非常普遍的监控工具。本课程将介绍目前公有云的基础监控体系的构建思路&#xff0c;讲述One产品对接Zabbix数据的必要性与可观测性赋能效果。 课程中会分享数据接入的过程&#xff0c;重点讲解zabbix工作机制&#xff0c;深入分析zabbix数据库表结构&#x…

TCP IP网络编程(四) 基于TCP的服务器端、客户端

文章目录 理解TCP、UDPTCP/IP协议栈链路层IP层TCP/UDP层应用层 实现基于TCP的服务器端、客户端TCP服务器端的默认函数调用顺序进入等待连接请求状态受理客户端连接请求TCP客户端的默认函数调用顺序基于TCP的服务器端、客户端函数调用关系 实现迭代服务器端、客户端实现迭代服务…

算法通关村第十六关:青铜挑战-滑动窗口其实很简单

青铜挑战-滑动窗口其实很简单 1. 滑动窗口基本思想 数组引入双指针的背景&#xff1a; 很多算法会大量移动数组中的元素&#xff0c;频繁移动元素会导致执行效率低下或者超时&#xff0c;使用两个变量能比较好的解决很多相关问题 数组双指针&#xff0c;之前介绍过 对撞型 和…

无涯教程-JavaScript - COMPLEX函数

描述 COMPLEX函数将实系数和虚系数转换为x yi或x yj形式的复数。 语法 COMPLEX (real_num, i_num, [suffix])争论 Argument描述Required/Optionalreal_numThe real coefficient of the complex number. Requiredi_numThe imaginary coefficient of the complex number.Re…

Java基础知识点汇总

一、Java基础知识点整体框架 详细知识点见链接资源&#xff0c;注&#xff1a;框架是用Xmind App完成&#xff0c;查看需下载。 二、基础知识各部分概况 2.1 认识Java 2.2 数据类型和变量 2.3 运算符 2.4 程序逻辑控制 2.5 方法的使用 2.6 数组的定义和使用 2.7 类和对象 2.8 …

Python入门学习14(面向对象)

一、内置方法 二、封装 1. 封装的概念是指&#xff1f; 将现实世界事物在类中描述为属性和方法&#xff0c;即为封装。 2. 什么是私有成员&#xff1f;为什么需要私有成员&#xff1f; 现实事物有部分属性和行为是不公开对使用者开放的。同样在类中描述属性和方法的时…

跑出创新加速度,AI基础软件成AIGC产业发展加速器

2023年中国国际服务贸易交易会&#xff08;以下简称“服贸会”&#xff09;受世界瞩目正在火热进行&#xff0c;9月4日&#xff0c;服贸会专题论坛之“2023中国AIGC创新发展论坛” 在大会期间成功举办&#xff0c;九章云极DataCanvas公司副总裁周晓凌受邀出席论坛&#xff0c;并…

【计算机视觉项目实战】中文场景识别

✨专栏介绍: 经过几个月的精心筹备,本作者推出全新系列《深入浅出OCR》专栏,对标最全OCR教程,具体章节如导图所示,将分别从OCR技术发展、方向、概念、算法、论文、数据集等各种角度展开详细介绍。 👨‍💻面向对象: 本篇前言知识主要介绍深度学习知识,全面总结知知识…

SW的stp文件转成CAD格式文件学习笔记

SW的stp文件转成CAD格式文件 如图一个STP文件&#xff0c;右上角标注是什么文件呢 另存为零件图&#xff0c;即另存为part 如图所示 用solidworks打开另存为的零件图&#xff0c;点击是&#xff0c;会识别特征 . 直接默认点对勾 之后会出现可编辑的零件图 另存为CA…

JVM调优记录

因为大量数据备份&#xff1b;导致在备份过程出现堆溢出的情况 当前情况 总内存&#xff1a;7.92G 已使用&#xff1a;3.7G jvm总内存最大&#xff1a;3.06G jvm非堆内存&#xff1a;最大1.23G&#xff0c;使用<170M jvm堆内存&#xff1a;最大1.83G 计算 如果预留2G扩展…

【教程】安防监控/视频存储/视频汇聚平台EasyCVR接入智能分析网关V4的操作步骤

TSINGSEE青犀AI边缘计算网关硬件 —— 智能分析网关目前有5个版本&#xff1a;V1、V2、V3、V4、V5&#xff0c;每个版本都能实现对监控视频的智能识别和分析&#xff0c;支持抓拍、记录、告警等&#xff0c;每个版本在算法模型及性能配置上略有不同。硬件可实现的AI检测包括&am…

深入理解联邦学习——联邦学习的分类

分类目录&#xff1a;《深入理解联邦学习》总目录 在实际中&#xff0c;孤岛数据具有不同分布特点&#xff0c;根据这些特点&#xff0c;我们可以提出相对应的联邦学习方案。下面&#xff0c;我们将以孤岛数据的分布特点为依据对联邦学习进行分类。 考虑有多个数据拥有方&…

0013Java程序设计-springboot教材图文内容审核系统

摘 要目 录第1章 绪论1.1 研究背景与意义1.2 研究内容1.3 论文组成结构 系统实现用户登录模块的实现后台管理系统登录模块的实现投稿信息的实现 开发环境 摘 要 《教材图文内容审核系统》课程案例库研究系统系统主要功能模块包括投稿信息、打卡记录、新闻资讯等&#xff0c;采…

USBCodec芯片的工作原理以及应用

USBCodec芯片通过USB接口从计算机中获取数字音频信号&#xff0c;并将其进行AO3401A采样处理。采样率通常为44.1kHz或48kHz&#xff0c;这是CD音质的标准采样率。高质量的USBCodec芯片还可以支持更高的采样率&#xff0c;例如96kHz或192kHz&#xff0c;以提供更好的音频体验。 …