当前位置: 首页 > news >正文

力扣面试150题--单词搜索

Day 74

题目描述

在这里插入图片描述

思路

初次思路:利用回溯的思想,具体做法如下:

  1. 设置一个标记的二维数组,用来记录已经被访问的元素
  2. 下面是back函数的内容,传入参数有back(char[][] board,String word,int[][] num,int n,int i,int j) board是字母表,word为要寻找的单词,num为标记数组,n为这轮back访问的word中该序号的字母,i,j为上一个字母在字母表中的坐标。
  3. 确定终止条件,只要访问完单词的长度即可
  4. 获取这轮需要寻找的字母beg
  5. 二重循环寻找与这个字母相同并且未被访问的元素坐标,
  6. 如果这是单词的第一个元素,直接寻找下一个字母
  7. 如果这是单词第二及以后的单词,与传进来的坐标i,j判断是否相邻
class Solution {public boolean res=false;public boolean exist(char[][] board, String word) {if(word.length()==0){return true;}int n=word.length();char beg=word.charAt(0);int[][]num=new int[board.length][board[0].length];for(int i=0;i<board.length;i++){for (int j = 0; j < board[i].length; j++) {num[i][j]=0;}}back(board,word,num,0,-1,-1);return res;}public void back(char[][] board,String word,int[][] num,int n,int i,int j){if(n==word.length()){res=true;return;}char beg=word.charAt(n);for (int k = 0; k < board.length; k++) {for (int l = 0; l < board[k].length; l++) {if(beg==board[k][l]&&num[k][l]==0){if(i==-1 && j==-1){//第一个元素num[k][l]=1;back(board,word,num,n+1,k,l);num[k][l]=0;}else{//第二个及以后的元素if((k==i-1&&l==j)||(k==i&&l==j-1)||(k==i&&l==j+1)||(k==i+1&&l==j)){//相邻num[k][l]=1;back(board,word,num,n+1,k,l);num[k][l]=0;}}}else{continue;}}}}
}

**优化思路:**修改上方寻找相邻元素的做法,传入坐标后,只判断相邻是否有目标字母。

class Solution {public boolean res=false;public boolean exist(char[][] board, String word) {if(word.length()==0){return true;}int n=word.length();char beg=word.charAt(0);int[][]num=new int[board.length][board[0].length];for(int i=0;i<board.length;i++){for (int j = 0; j < board[0].length; j++) {num[i][j]=0;}}for(int i=0;i<board.length;i++){for(int j=0;j<board[0].length;j++){if(board[i][j]==beg){num[i][j]=1;back(board,word,num,1,i,j);num[i][j]=0;}if(res){return true;}}}return false;}public void back(char[][] board,String word,int[][] num,int n,int i,int j){if(n==word.length()){res=true;return;}char beg=word.charAt(n);int x,y;x=i-1;y=j;if(x>=0&&board[x][y]==beg&&num[x][y]==0){num[x][y]=1;back(board,word,num,n+1,x,y);num[x][y]=0;}x=i;y=j-1;if(y>=0&&board[x][y]==beg&&num[x][y]==0){num[x][y]=1;back(board,word,num,n+1,x,y);num[x][y]=0;}x=i;y=j+1;if(y<board[0].length&&board[x][y]==beg&&num[x][y]==0){num[x][y]=1;back(board,word,num,n+1,x,y);num[x][y]=0;}x=i+1;y=j;if(x<board.length&&board[x][y]==beg&&num[x][y]==0){num[x][y]=1;back(board,word,num,n+1,x,y);num[x][y]=0;}}
}
http://www.xdnf.cn/news/1113985.html

相关文章:

  • MySQL 分表功能应用场景实现全方位详解与示例
  • Flink学习笔记:整体架构
  • Docker(02) Docker-Compose、Dockerfile镜像构建、Portainer
  • 13. Flink 高可用机制简述(Standalone 模式)
  • 14.ResourceMangaer启动解析
  • 鸿蒙项目构建配置
  • LabVIEW智能避障小车
  • Http与Https区别和联系
  • [NCTF2019]Fake XML cookbook
  • 六、深度学习——NLP
  • Redis 基础详细介绍(Redis简单介绍,命令行客户端,Redis 命令,Java客户端)
  • 编程与数学 03-001 计算机组成原理 04_非数值数据表示与校验码
  • Rerank模型
  • 【设计模式】职责链模式(责任链模式) 行为型模式,纯与不纯的职责链模式
  • LeetCode|Day9|976. 三角形的最大周长|Python刷题笔记
  • [论文阅读] 软件工程 | 首个德语软件工程情感分析黄金标准数据集:构建与价值解析
  • 开发语言的优劣势对比及主要应用领域分析
  • 【PTA数据结构 | C语言版】简单计算器
  • 深入解析Hadoop RPC:技术细节与推广应用
  • Namespace查看容器状态
  • 基于 SpringBoot 的 REST API 与 RPC 调用的统一封装
  • Maven项目没有Maven工具,IDEA没有识别到该项目是Maven项目怎么办?
  • monorepo 发布库 --- 发布
  • 在 Microsoft Edge 中,你可以使用 IE 兼容模式(Internet Explorer Mode)来运行 IE 内核 的网站。
  • DH(Denavit–Hartenberg)矩阵
  • 范畴论重构三生原理的具体案例?
  • AI(学习笔记第五课) 使用langchain进行AI开发 load documents(web)
  • python基础知识pip配置pip.conf文件
  • 开发语言中关于面向对象和面向过程的笔记
  • python 虚拟环境 Anaconda Miniconda