牛客NC242 单词搜索【中等 递归DFS C++/Java/Go/PHP】

news2024/11/26 23:58:43

题目

在这里插入图片描述
在这里插入图片描述
题目链接:
https://www.nowcoder.com/practice/987f2981769048abaf6180ed63266bb2

思路

递归:以word第一个字符为起点,在矩阵中
递归搜索,检查是否存在完整的word路径,
注意恢复现场,又叫回溯,这是核心

参考答案C++

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param board string字符串vector
     * @param word string字符串
     * @return bool布尔型
     */
    bool exist(vector<string>& board, string word) {
        //dfs
        int n = board.size();
        int m = board[0].size();

        vector<vector<bool>> visted(n, vector<bool>(m));

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (board[i][j] == word[0]) {
                    if (dfs(board, i, j, word, 0, visted)) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    bool dfs(vector<string>& board, int i, int j, string word, int idx,
             vector<vector<bool>> visited) {
        if (idx == word.size())
            return true;
        if (i < 0 || i >= board.size() || j < 0 || j >= board[0].size() ||
                visited[i][j] || board[i][j] != word[idx])
            return false;

        visited[i][j] = true;
        //从上下左右搜索
        bool b1 = dfs(board, i - 1, j, word, idx + 1, visited);
        bool b2 = dfs(board, i + 1, j, word, idx + 1, visited);
        bool b3 = dfs(board, i, j - 1, word, idx + 1, visited);
        bool b4 = dfs(board, i, j + 1, word, idx + 1, visited);
        visited[i][j] = false; //恢复现场,又叫回溯

        return b1 || b2 || b3 || b4;
    }
};

参考答案Java

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param board string字符串一维数组
     * @param word string字符串
     * @return bool布尔型
     */
    public boolean exist (String[] board, String word) {
        //dfs
        int n = board.length;
        int m = board[0].length();
        boolean[][] visited = new boolean[n][m];
        for (int i = 0; i < n ; i++) {
            for (int j = 0; j < m ; j++) {
                if (board[i].charAt(j) == word.charAt(0)) {
                    //开始dfs
                    if ( dfs(board, i, j, word, 0, visited)) {
                        return true;
                    }
                }
            }
        }

        return false;
    }

    //当前来到board的i行j列,检查board[i,j]是否等于word[idx]
    public boolean dfs(String[] board, int i, int j, String word, int idx,
                       boolean[][] visited) {
        if (idx == word.length()) return true; //说明在矩阵中找到了单词

        //判断是否越界,是否访问过,检查board[i,j]是否等于word[idx]
        if (i < 0 || i >= board.length || j < 0 || j >= board[0].length() ||
                visited[i][j] || board[i].charAt(j) != word.charAt(idx)) {
            return false;
        }
        visited[i][j] = true;
        boolean b1 = dfs(board, i - 1, j, word, idx + 1, visited);
        boolean b2 =  dfs(board, i + 1, j, word, idx + 1, visited);
        boolean b3 =  dfs(board, i, j - 1, word, idx + 1, visited);
        boolean b4 =  dfs(board, i, j + 1, word, idx + 1, visited);
        visited[i][j] = false; //恢复现场,又叫回溯

        return b1 || b2 || b3 || b4;
    }
}

参考答案Go

package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param board string字符串一维数组
 * @param word string字符串
 * @return bool布尔型
 */
func exist(board []string, word string) bool {
	//dfs
	n := len(board)
	m := len(board[0])
	visited := make([][]bool, n)
	for i := 0; i < n; i++ {
		visited[i] = make([]bool, m)
	}

	for i := 0; i < n; i++ {
		for j := 0; j < m; j++ {
			if board[i][j] == word[0] {
				if dfs(board, i, j, word, 0, visited) {
					return true
				}
			}
		}
	}
	return false
}

func dfs(board []string, i, j int, word string, idx int, visited [][]bool) bool {
	if idx == len(word) {
		return true
	}

	if i < 0 || i >= len(board) || j < 0 || j >= len(board[0]) || visited[i][j] || board[i][j] != word[idx] {
		return false
	}

	visited[i][j] = true
	//上下左右搜索
	b1 := dfs(board, i-1, j, word, idx+1, visited)
	b2 := dfs(board, i+1, j, word, idx+1, visited)
	b3 := dfs(board, i, j-1, word, idx+1, visited)
	b4 := dfs(board, i, j+1, word, idx+1, visited)
	visited[i][j] = false //恢复现场,又叫回溯

	return b1 || b2 || b3 || b4
}

参考答案PHP

<?php


/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param board string字符串一维数组 
 * @param word string字符串 
 * @return bool布尔型
 */
function exist( $board ,  $word )
{
      //dfs
    $n= count($board);
    $m = strlen($board[0]);
    $visited =[];
    for($i=0;$i<$n;$i++){
        for($j=0;$j<$m;$j++){
            $visited[$i][$j]=false;
        }
    }

    for($i=0;$i<$n;$i++){
        for($j=0;$j<$m;$j++){
          if($board[$i][$j] ==$word[0]){
              if(dfs($board,$i,$j,$word,0,$visited)){
                  return true;
              }
          }
        }
    }

    return false;
}


function dfs($board,$i,$j,$word,$idx,$visited){
    if($idx == strlen($word))
        return true;

    if($i<0 || $i>=count($board) || $j<0 || $j>=strlen($board[0]) ||$visited[$i][$j] || $board[$i][$j]!=$word[$idx])
        return false;

    $visited[$i][$j]=true;
    //上下左右四个方向搜索
    $b1 = dfs($board,$i-1,$j,$word,$idx+1,$visited);
    $b2 = dfs($board,$i+1,$j,$word,$idx+1,$visited);
    $b3 = dfs($board,$i,$j-1,$word,$idx+1,$visited);
    $b4 = dfs($board,$i,$j+1,$word,$idx+1,$visited);
    $visited[$i][$j]=false; //恢复现场,又叫回溯
    return $b1||$b2||$b3||$b4;
}

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

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

相关文章

OmniReader Pro for Mac:强大且全面的阅读工具

OmniReader Pro for Mac是一款专为Mac用户设计的强大且全面的阅读工具&#xff0c;它集阅读、编辑、管理等多种功能于一身&#xff0c;为用户提供了卓越的阅读体验。 OmniReader Pro for Mac v2.9.5激活版下载 该软件支持多种文件格式的阅读&#xff0c;包括PDF、Word、Excel、…

基础款:Dockerfile 文件

# bash复制代码# 使用 Node.js 16 作为基础镜像 # 指定一个已经存在的镜像作为模版&#xff0c;第一条必须是from FROM node:16# 将当前工作目录设置为/app # WORKDIR /app# 方法一&#xff1a;用dockerfile命令&#xff1a;进行下载打包文件 # 将 package.json 和 package-loc…

简单易懂的下载学浪视频教程- 小浪助手

接下来我就教大家如何通过小浪助手&#xff0c;轻松下载你想要下载的学浪app视频 首先准备好小浪助手 工具我已经打包好了&#xff0c;有需要的自己取一下 学浪下载器链接&#xff1a;https://pan.baidu.com/s/1djUmmnsfLEt_oD2V7loO-g?pwd1234 提取码&#xff1a;1234 -…

【机器学习】集成学习---Bagging之随机森林(RF)

【机器学习】集成学习---Bagging之随机森林&#xff08;RF&#xff09; 一、引言1. 简要介绍集成学习的概念及其在机器学习领域的重要性。2. 引出随机森林作为Bagging算法的一个典型应用。 二、随机森林原理1. Bagging算法的基本思想2. 随机森林的构造3. 随机森林的工作机制 三…

【kettle006】kettle访问华为openGauss高斯数据库并处理数据至execl文件

1.一直以来想写下基于kettle的系列文章&#xff0c;作为较火的数据ETL工具&#xff0c;也是日常项目开发中常用的一款工具&#xff0c;最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下华为openGauss高斯数据库相关知识体系 3.欢迎批评指正&#xff0c;跪谢…

格瑞威特 | 邀您参加2024全国水科技大会暨技术装备成果展览会

—— 展位号&#xff1a;A13 —— 企业介绍 北京格瑞威特环保设备有限公司成立于2009年&#xff0c;是专业从事设计、研发、销售智能加药计量泵、在线水质分析仪表、便携式水质分析仪表、流量计、液位计、阀门、搅拌机、烟气报警仪、加药装置等各类水处理设备及配件的OEM供服…

一、初识VUE

Vue Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。另一方面&…

滑块验证码破解----Java使用opencv后端破解滑块验证

使用技术:Java SpringBootopenCV 在windows上首先需要下载opencv进行安装,先去官网:Releases - OpenCV 下载这个windows版本的安装包 下载后直接安装解压就行,然后需要,然后找到安装位置里的这个文件: 你下载的是什么版本的,这里的数字就是多少,比如我下载4.5.3版本那么这…

【CANoe示例分析】TCP Chat(CAPL) with TLS encription

1、工程路径 C:\Users\Public\Documents\Vector\CANoe\Sample Configurations 15.3.89\Ethernet\Simulation\TLSSimChat 在CANoe软件上也可以打开此工程:File|Help|Sample Configurations|Ethernet - Simulation of Ethernet ECUs|Basic AUTOSAR Adaptive(SOA) 2、示例目…

嘉楠堪智 CanMV K230 的 CanMV-IDE 环境与 MicroPython 编程

嘉楠推出了 CanMV IDE 开发环境&#xff0c;可以使用 MicroPython 开发针对 CanMV K230 的各种程序&#xff0c;同时也提供了大量的例子程序&#xff0c;方便使用者学习。 嘉楠开发者社区&#xff0c;给出了详细的 CanMV K230 教程&#xff0c;可以借以快速上手。 目录 固件…

【Java难点】多线程终极

悲观锁和乐观锁 悲观锁 synchronized关键字和Lock的实现类都是悲观锁。 它很悲观&#xff0c;认为自己在使用数据的时候一定有别的线程来修改数据&#xff0c;因此在获取数据的时候会一不做二不休的先加锁&#xff0c;确保数据不会被别的线程修改。 适合写操作多的场景&…

船用组装式中央空调案例

船用组装式空调的整体介绍 1.1 装置的主要技术数据及配套设备规格 该轮采用的是船用组装式空调装置。 1.1.1 空调装置 1&#xff09;型号&#xff1a;CJKR-116船用组装式空调装置&#xff1b;2&#xff09;制冷型式&#xff1a;直接蒸发式&#xff1b;3&#xff09;制冷量&…

【汇编】#6 80x86指令系统其二(串处理与控制转移与子函数)

文章目录 一、串处理指令1. 与 REP 协作的 MOVS / STOS / LODS的指令1.1 重复前缀指令REP1.2 字符串传送指令&#xff08;Move String Instruction&#xff09;1.2 存串指令&#xff08;Store String Instruction&#xff09;1.3 取字符串指令&#xff08;Load String Instruct…

VULHUB复现fastjson1.2.24反序列化漏洞

蚌埠住了&#xff0c;遇到了很多奇奇怪怪的问题。 如果你问我为啥不用kali&#xff0c;我会告诉你&#xff0c;我电脑上的kali装不成docker-compose!我急用了ubuntu如果你问我为啥用ubuntu克隆&#xff0c;我会告诉你&#xff0c;我电脑上的kali不能安装成功java8这个版本如果你…

一二三应用开发平台使用手册——系统管理-权限项模块-使用说明

权限项 概述 在RBAC模型中&#xff0c;资源、角色、用户三个关键元素&#xff0c;构成权限体系。资源是权限控制的对象&#xff0c;因此常称之为权限项。 平台中所有的权限项进行集中管理&#xff0c;菜单、按钮、请求、分组等通过类型进行区分&#xff0c;实体与库表公用&a…

读天才与算法:人脑与AI的数学思维笔记13_Coq证明助手

1. 计算机 1.1. 对于计算机来说&#xff0c;它就很擅长处理这种重复而机械且计算量庞大的任务 1.1.1. 在速度与准确性等方面&#xff0c;计算机是远超过手工计算的 1.2. 计算机只能执行指令&#xff0c;并无自主创造力 1.2.1. 想…

第七天 dfs剪枝优化

第七天 dfs剪枝&优化 1可行性剪枝 2最优性剪枝 3重复性剪枝 题 1 输入 5 5 6 …S. XX.X. …X… …D.X …X… 输出 YES —————————————— 题解 #include<iostream> #include<cstdio> using namespace std; const int N 10; int n,m,T; char …

分治策略 --- 快排归并

目录 分治-快排 一、颜色分类 二、排序数组 三、数组中的第K个最大元素 四、库存管理 分治-归并 一、排序数组 二、交易逆序对的总数 三、计算右侧小于当前元素的个数 四、翻转对 分治是一种思想&#xff0c;也就是将大问题分解成小问题&#xff0c;一直分到小问题可…

【bug已解决】发生错误,导致虚拟 CPU 进入关闭状态。如果虚拟机外部发生此错误,则可能已导致物理计算机重新启动......

本bug报错已找到原因,并成功解决。 项目场景: vmware安装ubuntu报错。 如下: 发生错误,导致虚拟 CPU 进入关闭状态。如果虚拟机外部发生此错误,则可能已导致物理计算机重新启动。错误配置虚拟机、客户机操作系统中的错误或 VMware Workstation 中的问题都可以导致关闭状…

关于google search console工具提交sitemap.xml无法抓取的问题解决办法

其实这个问题很好解决。 第一种情况&#xff1a;利用工具为我们的网站自动生成静态的sitemap.xml文件。这种可以检查下是否完整&#xff0c;然后上传到根目录下去&#xff0c;再去google search console提交我们的网站地图。 第二种情况&#xff1a;同样利用工具自动生成动态s…