当前位置: 首页 > 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.dtcms.com/a/277708.html

相关文章:

  • Java面试基础:面向对象(2)
  • CCPD 车牌数据集提取标注,并转为标准 YOLO 格式
  • C++--红黑树封装实现set和map
  • duckdb和pyarrow读写arrow格式的方法
  • H3C无线旁挂2层直接转发组网模拟实验
  • opendrive文件的格式
  • 专业PPT图片提取工具,操作简单
  • 【Python练习】041. 编写一个函数,检查一个二叉树是否是平衡二叉树
  • 大数据在UI前端的应用深化研究:用户行为数据的情感分析
  • MySQL实操:将Word表格数据导入MySQL表
  • python学习——Matplotlib库的基础
  • 4. MyISAM vs InnoDB:深入解析MySQL两大存储引擎
  • c语言进阶 深度剖析数据在内存中的存储
  • Spring-----MVC配置和基本原理
  • Opencv---blobFromImage
  • macos安装iper3
  • Java面试(基础题)-第一篇!
  • C++模版编程:类模版与继承
  • QCustomPlot绘图结合滑动条演示
  • anaconda常用命令
  • 第一个Flink 程序 WordCount,词频统计(批处理)
  • 从架构到代码:飞算JavaAI电商订单管理系统技术解构
  • 关键点检测 roboflow 折弯识别
  • 从“被动巡检”到“主动预警”:塔能物联运维平台重构路灯管理模式
  • Word 文字编辑状态下按回车换行后是非正文格式
  • 【LeetCode 热题 100】23. 合并 K 个升序链表——(解法一)逐一合并
  • FastAPI快速构建完成一个简单的demo,(curd)
  • 深入理解 Java JVM
  • BERT系列模型
  • Spring Boot 配置注解处理器 - spring-boot-configuration-processor