leetcode79.单词搜索

server/2025/1/18 7:01:05/

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

思路:原始思路是四个方向回溯,注意一旦找到word后续不用再进行搜索,立刻停止;但往往面试官会要求做优化,因此优化算法为统计word和board次数,如果一个字母在word中出现了x次,在board中出现了y次,且y<x,则不用再进行查找,直接返回false。

StringBuffer buffer=new StringBuffer();boolean [][]flag=new boolean[6][6];//使用used数组记录哪些已经使用过了,防止重复利用Map<Character,Integer> map=new HashMap<>();public boolean exist(char[][] board, String word) {// 优化:如果一个字母在word中出现了x次,在board中出现了y次,且y<x,则不用再进行查找,直接返回falsefor(int m=0;m<word.length();m++){if(!map.containsKey(word.charAt(m)))map.put(word.charAt(m),1);elsemap.put(word.charAt(m),map.get(word.charAt(m))+1);}for(int i=0;i<board.length;i++){for(int j=0;j<board[0].length;j++){if(map.containsKey(board[i][j]))map.put(board[i][j],map.get(board[i][j])-1);}}Set<Character> set=new HashSet<>();for(Character key :set){if(map.get(key)>0)return false;}for(int i=0;i<board.length;i++){for(int j=0;j<board[0].length;j++){if(board[i][j]==word.charAt(0)){buffer.append(board[i][j]);flag[i][j]=true;if(backTracking(board,word,i,j,1))return true;buffer.deleteCharAt(buffer.length()-1);flag[i][j]=false;}}}return false;}public boolean backTracking(char[][]board,String word,int i,int j,int index){if(buffer.length()==word.length())return true;// 四种情况搜索if(i+1<board.length&&board[i+1][j]==word.charAt(index)&&flag[i+1][j]==false){buffer.append(board[i+1][j]);flag[i+1][j]=true;if(backTracking(board,word,i+1,j,index+1))return true;buffer.deleteCharAt(buffer.length()-1);flag[i+1][j]=false;}if(i-1>=0&&board[i-1][j]==word.charAt(index)&&flag[i-1][j]==false){buffer.append(board[i-1][j]);flag[i-1][j]=true;if(backTracking(board,word,i-1,j,index+1))return true;buffer.deleteCharAt(buffer.length()-1);flag[i-1][j]=false;}if(j+1<board[0].length&&board[i][j+1]==word.charAt(index)&&flag[i][j+1]==false){buffer.append(board[i][j+1]);flag[i][j+1]=true;if(backTracking(board,word,i,j+1,index+1))return true;buffer.deleteCharAt(buffer.length()-1);flag[i][j+1]=false;}if(j-1>=0&&board[i][j-1]==word.charAt(index)&&flag[i][j-1]==false){buffer.append(board[i][j-1]);flag[i][j-1]=true;if(backTracking(board,word,i,j-1,index+1))return true;buffer.deleteCharAt(buffer.length()-1);flag[i][j-1]=false;}return false;}


http://www.ppmy.cn/server/158994.html

相关文章

mysql 双主双从 + proxysql 代理

环境 主机ipmaster1192.168.233.101master2192.168.233.102slave1192.168.233.103slave2192.168.233.104client192.168.233.105 需求 master1和master2互为主从&#xff0c;slave1是master1的从&#xff0c;slave2是master2的从。 master主机通过proxysql代理实现负载均衡的…

迅为RK3568开发板篇OpenHarmony配置HDF驱动控制LED-新增 topeet子系统-编写 bundle.json文件

bundle.json 文件内容如下所示&#xff1a; 下面是对各个字段的解释&#xff1a; 1. name: "ohos/demos" - 这是组件或项目的名称&#xff0c;这里表示它属于 OHOS&#xff08;OpenHarmony OS&#xff09;生态系统下的一个名为"demos"的组件。 2. descri…

3.flask蓝图使用

构建一个目录结构 user_oper.py from flask import Blueprint, request, session, redirect, render_template import functools # 创建蓝图 user Blueprint(xkj, __name__)DATA_DICT {1: {"name": "张三", "age": 22, "gender": …

《零基础Go语言算法实战》【题目 2-30】并发安全问题

《零基础Go语言算法实战》 【题目 2-30】并发安全问题 请举例说明如何在 Go 语言的 map 中保证并发安全&#xff0c;且需要实现以下接口&#xff1a; type sp interface { Out(key string, val interface{}) } 【解答】 题目中要求并发安全&#xff0c;那么必须用锁&…

Python爬虫-汽车之家各车系周销量榜数据

前言 本文是该专栏的第43篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前,笔者在文章《Python爬虫-汽车之家各车系月销量榜数据》中,有详细介绍,如何爬取“各车系车型的月销量榜单数据”的方法以及完整代码教学教程。 而本文,笔者同样以汽车之家平台为例,…

《DOM NodeList》

《DOM NodeList》 介绍 DOM&#xff08;文档对象模型&#xff09;是HTML和XML文档的编程接口&#xff0c;它允许开发者在JavaScript等编程语言中操作文档的结构、样式和内容。在DOM中&#xff0c;NodeList是一个重要的接口&#xff0c;它表示一个包含节点&#xff08;如元素、…

Ubuntu Server挂载AWS S3成一个本地文件夹

2023年&#xff0c;AWS出了个mountpoint的工具&#xff1a; https://github.com/awslabs/mountpoint-s3 如下是另外一种方式&#xff0c;通过s3fs-fuse 这个工具 sudo apt-get install automake autotools-dev \fuse g git libcurl4-gnutls-dev libfuse-dev \libssl-dev libx…

Vue2+OpenLayers实现车辆开始、暂停、重置行驶轨迹动画(提供Gitee源码)

前言&#xff1a;根据经纬度信息绘制一个完整的行驶路线&#xff0c;车辆根据绘制好的路线从开始点位行驶到结束点位&#xff0c;可以通过开始、暂停、重置按钮控制车辆状态。 目录 一、案例截图 二、安装OpenLayers库 三、​安装Element-UI ​ 四、代码实现 4.1、初始化…