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

news/2024/10/18 0:19:31/

题目

在这里插入图片描述
在这里插入图片描述
题目链接:
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) {//dfsint 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) {//dfsint 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)) {//开始dfsif ( 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 {//dfsn := 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.ppmy.cn/news/1455005.html

相关文章

网络初始化配置

IPADDR192.168.23.10 #新的ip地址&#xff0c;ip的网段要与nat模式下的网段一致 NETMASK255.255.255.0 #子网掩码 GATEWAY192.168.23.2 #网关 DNS1114.114.114.114 #域名解析&#xff1a;配置为国内114.114.114.114&#xff0c;国外8.8.8.8 ONBOOTtrue 启动时该网卡…

大数据技术主要学什么,有哪些课程

大数据技术是指在海量数据的环境下&#xff0c;采集、存储、处理、分析和管理数据的一系列技术与方法。随着互联网、物联网以及各种智能设备的普及&#xff0c;数据量呈爆炸性增长&#xff0c;传统数据处理手段已难以应对&#xff0c;因此大数据技术应运而生&#xff0c;旨在从…

如何在交换机上重置密码而不丢失配置?如何配置SSH远程登录?

在网络设备管理中&#xff0c;保持设备的安全性是至关重要的&#xff0c;所以console密码是必须设置的&#xff0c;绝对不能偷懒。 但是&#xff0c;如果习惯不好&#xff0c;或者离职时交接不好&#xff0c;就会导致密码丢失&#xff0c;此时想要修改网络设置的配置就麻烦了。…

SparkSql介绍

概述 SparkSQL&#xff0c;顾名思义&#xff0c;就是Spark生态体系中的构建在SparkCore基础之上的一个基于SQL的计算模块。SparkSQL的前身不叫SparkSQL&#xff0c;而叫Shark&#xff0c;最开始的时候底层代码优化&#xff0c;sql的解析、执行引擎等等完全基于Hive&#xff0c…

卡件SM711,SM472,SM481和利时

系统卡件❗电:183-6998-1851❗运行时组态是组态软件新近提出的SM711,SM472,SM481和利时。运行时组态是在运行环境下对已有工程进行修改&#xff0c;添加新的功能。它不同于在线组态&#xff0c;在线组态是在工程运行的同时&#xff0c;进入组态环境&#xff0c;卡件SM711,SM472…

商业银行业务档案管理规范

商业银行业务档案管理规范 1 范围 本文件规定了商业银行的业务档案工作总则、管理体制、管理模式、管理岗位职责等管理要求&#xff0c;及商业银行业务文件的收集、分类、整理、归档&#xff0c;商业银行业务档案的保管、利用、鉴定与处置的要求与方法。 本文件适用于商业银…

clang:在 Win10 上编译 MIDI 音乐程序(一)

先从 Microsoft C Build Tools - Visual Studio 下载 1.73GB 安装 "Microsoft C Build Tools“ 访问 Swift.org - Download Swift 找到 Windows 10&#xff1a;x86_64 下载 swift-5.10-RELEASE-windows10.exe 大约490MB 建议安装在 D:\Swift\ &#xff0c;安装后大约占…

SQL注入-基础知识

目录 前言 一&#xff0c;SQL注入是什么 二&#xff0c;SQL注入产生的条件 三&#xff0c;学习环境介绍 四、SQL注入原理 五&#xff0c;SQL中常用的函数 六&#xff0c;关于Mysql数据库 前言 在网络安全领域中&#xff0c;sql注入是一个无法被忽视的关键点&#xff0c…