Leetcode 79. Word Search [C + + / java detailed problem]

leetcode word search java detailed

「C'est ma participation11Le défi du mois de juin25Oh, mon Dieu.,Voir les détails de l'événement:2021Un dernier défi」. De l'Université des sciences du lac

1、Titre

Compte tenu d'un m x n Grille de caractères 2D board Et un mot de chaîne word .Si word Existe dans la grille,Retour true ;Sinon,Retour false .

Les mots doivent être en ordre alphabétique,Composé de lettres dans les cellules adjacentes,Parmi eux“Adjacent”Les cellules sont celles qui sont adjacentes horizontalement ou verticalement.Les lettres d'une même cellule ne peuvent pas être réutilisées.

Exemple 1:

Entrée:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
Produits:true
Copier le Code

Exemple 2:

Entrée:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
Produits:true
Copier le Code

Exemple 3:

Entrée:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB"
Produits:false
Copier le Code

Conseils:

  • m == board.length

  • n = board[i].length

  • 1 <= m, n <= 6

  • 1 <= word.length <= 15

  • board Et word Se compose uniquement de lettres majuscules et minuscules

2、Idées

(Retour en arrière) O ( n 2 3 k ) O(n^2 3^k)

Recherche en profondeur,Nous définissons un tel ordre de recherche,C'est - à - dire énumérer d'abord le début d'un mot,Ensuite, énumérez chaque lettre du mot à son tour.Dans ce processus, il est nécessaire de changer la lettre déjà utilisée en une lettre spéciale,Pour éviter la réutilisation des caractères.

Conception de la fonction récursive:

bool dfs(vector<vector<char>>& board, string& word,int u,int x,int y) Copier le Code

uReprésente le mot cible actuellement énuméréwordNouPosition.

x,yEst l'abscisse et l'ordonnée de la grille de caractères 2D actuellement recherchée.

Le processus de recherche est le suivant:

  • 1、Énumérez les points de départ de chaque mot dans une grille de caractères 2D.
  • 2、À partir de ce point de départ, cherchez des mots autour de vousword,Et Notez qu'à ce moment - là, l'énumération des motswordDeuPosition ( uDe0C'est parti.).
  • 3、Si l'emplacement de la recherche actuelle(x,y)Éléments deboard[x][y] == word[u],Continuez à chercher partout.
  • 4、Jusqu'à ce qu'il soit énuméré au motwordLa dernière lettre deture,Sinon, retournez àfalse.

Limite récursive:

  • 1、Lorsque l'emplacement actuel apparaît dans le processus de rechercheboard[x][y] != word[u] ,Description le chemin actuel est illégal,Retourfalse.
  • 2、u == word.size() - 1,Recherche réussie à la fin du mot,Retourtrue.

Détails de la mise en œuvre:

  • 1、 Lorsque vous continuez à chercher le niveau suivant ,L'emplacement actuel doit être identifié,Indique qu'une recherche a été effectuée

  • 2、Vous pouvez utiliser un tableau offset pour simplifier le Code.

Analyse de la complexité temporelle: Il y a un total de n 2 n^2 - Oui.,Chaque lettre d'un mot a quatre directions à choisir,Mais comme il n'y a pas de retour en arrière,Donc, à part les initiales,Il n'y a que trois options.Donc la complexité temporelle totale est O ( n 2 3 k ) O(n^2 3^k) .

3、c++Code

class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
for(int i = 0; i < board.size(); i++)
for(int j = 0; j < board[i].size(); j++)
if(dfs(board,word,0,i,j)) return true;
return false;
}
int dx[4] = {-1,0,1,0}, dy[4] = {0,1,0,-1}; //Tableau de direction
bool dfs(vector<vector<char>>& board, string& word,int u,int x,int y) {
if(board[x][y] != word[u]) return false;
if(u == word.size() - 1) return true;
char t = board[x][y];
board[x][y] = '.';
for(int i = 0; i < 4; i++)
{
int a = x + dx[i], b = y + dy[i];
//Sortir de la frontière ou aller à un endroit déjà recherché
if(a < 0 || a >= board.size() || b < 0 || b >= board[0].size() || board[a][b] == '.') continue;
if(dfs(board,word,u+1,a,b)) return true;
}
board[x][y] = t;
return false;
}
};
Copier le Code

4、javaCode

class Solution {
public boolean exist(char[][] board, String word) {
for(int i = 0; i < board.length; i++)
for(int j = 0; j < board[i].length; j++)
if(dfs(board,word,0,i,j)) return true;
return false;
}
int[] dx = new int[]{-1,0,1,0}, dy = new int[]{0,1,0,-1};
boolean dfs(char[][] board, String word,int u,int x,int y) {
if(board[x][y] != word.charAt(u)) return false;
if(u == word.length() - 1) return true;
char t = board[x][y];
board[x][y] = '.';
for(int i = 0; i < 4; i++)
{
int a = x + dx[i], b = y + dy[i];
if(a < 0 || a >= board.length|| b < 0 || b >= board[0].length || board[a][b] == '.') continue;
if(dfs(board,word,u+1,a,b)) return true;
}
board[x][y] = t;
return false;
}
}
Copier le Code

Lien vers la question originale:79. Recherche de mots Insérer la description de l'image ici

版权声明
本文为[Il n'y a pas de cerfs dans les bois.]所创,转载请带上原文链接,感谢
https://javamana.com/2021/11/20211125172138272h.html

  1. JavaScript高级程序设计读后感(一)之零碎知识点查漏补缺
  2. 先到先学!Alibaba甩出第四次更新的JDK源码高级笔记(终极版)
  3. Java File类
  4. How To Install MariaDB on linux
  5. #yyds干货盘点# Mybatis 的 XML 配置
  6. Spring认证中国教育管理中心-Spring Data MongoDB教程七
  7. Linux进程和任务管理
  8. Linux文件系统日志分析
  9. Redis-客户端-重点知识
  10. Redis-事件-重点知识
  11. Redis-AOF持久化-重点知识
  12. Redis-RDB持久化-重点知识
  13. http://lx.gongxuanwang.com/sszt/32.htm
  14. 回顾我两个月面试阿里,携程,小红书,美团,网易等等(Java岗)
  15. JavaScript高级程序设计读后感(一)之零碎知识点查漏补缺
  16. Rocketmq source code analysis: message sending process
  17. Rocketmq source code analysis: how does rocketmq store messages?
  18. RocketMQ source analysis: how to debug the RocketMQ source in IDEA
  19. How To Install MariaDB on linux
  20. Comment installer mariadb sur Linux
  21. http://lx.gongxuanwang.com/sszt/7.htm
  22. Classe de fichiers Java
  23. Premier arrivé, premier servi! Alibaba lance la quatrième mise à jour de JDK source Advanced notes (Ultimate)
  24. #yyds干货盘点#设计模式之【工厂模式】
  25. Java * SpringBoot实现万能文件在线预览,已开源,真香
  26. Redis | 第4章 Redis中的数据库《Redis设计与实现》
  27. Liang Tingwei's first variety show of "director, please give advice" reshapes the classic work "spring of a new town"
  28. Redis | 第4章 Redis中的数据库《Redis设计与实现》
  29. 关于centos docker版本过低导致 is not a valid repository/tag: invalid reference format
  30. Redis 源码简洁剖析 02 - SDS 字符串
  31. 回顧我兩個月面試阿裏,攜程,小紅書,美團,網易等等(Java崗)
  32. Rétrospectivement, j'ai passé deux mois à interviewer Ali, ctrip, Little Red Book, meituan, NetEase, etc. (Java post)
  33. Docker + webhook Automation Deployment Front End Project
  34. Java技术之Spring、Hibernate框架整合方法
  35. http://lx.gongxuanwang.com/sszt/32.htm
  36. 亚马逊自己的 Linux 发行版现在完全基于 Fedora 了
  37. Redis 源码简洁剖析 02 - SDS 字符串
  38. Java技術之Spring、Hibernate框架整合方法
  39. Méthode d'intégration des cadres de printemps et d'hibernation de la technologie Java
  40. Redis source Concise Analysis 02 - SDS String
  41. La distribution Linux d'Amazon est maintenant entièrement basée sur Fedora
  42. org.springframework.web.bind.MissingServletRequestParameterException
  43. Built in constraints and functions of MySQL Foundation (2)
  44. Basic operation of MySQL Foundation (I)
  45. Introduction to Java zero foundation 3: Java data types
  46. 从零开始搭建EasyDarwin环境——Linux系统开发环境搭建Golang
  47. Redis source Concise Analysis 02 - SDS String
  48. Construire l'environnement easydarwin à partir de zéro - - construire l'environnement de développement du système Linux golang
  49. javaweb代码是正确的,但是第一行代码就报错了
  50. **** | Java | 后端开挂:3行代码写出8个接口
  51. Java || 看了大二学长写的代码,我竟开始默默的模仿了。。。
  52. Java | 手把手教你实现一个抽奖系统(Java版)
  53. Java | Manuel pour vous apprendre à mettre en œuvre un système de loterie (version Java)
  54. Java | | après avoir lu le Code que j'ai écrit en deuxième année, j'ai commencé à imiter silencieusement...
  55. Java | back - end Pending: 3 - line Code write 8 Interfaces
  56. Le Code Web Java est correct, mais la première ligne de code est incorrecte
  57. Android网络编程之Http通信
  58. Android網絡編程之Http通信
  59. Http communication for Android Network Programming
  60. The story of spring