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

LintCode 123 · Word Search (DFS字符处理经典题!)

123 · Word Search
Algorithms
Medium
Description
Given a 2D board and a string word, find if the string word exists in the grid.

The string word can be constructed from letters of sequentially adjacent cell, where “adjacent” cells are those horizontally or vertically neighboring.

The same letter cell may not be used more than once.

The dimension of the letter matrix does not exceed 100, and the length of the string does not exceed 100.

Example
Example 1:

Input:

board = [“ABCE”,“SFCS”,“ADEE”]
word = “ABCCED”
Output:

true
Explanation:

[
A B C E
S F C S
A D E E
]
(0,0)->(0,1)->(0,2)->(1,2)->(2,2)->(2,1)

Example 1:

Input:

board = [“z”]
word = “z”
Output:

true
Explanation:

[ z ]
(0,0)

解法1:DFS+hashset。
很多小地方需要注意,特别是visited[][]数组什么时候clear掉。

class Solution {
public:/*** @param board: A list of lists of character* @param word: A string* @return: A boolean*/bool exist(vector<vector<char>> &board, string &word) {int m = board.size();if (m == 0) return word.empty();int n = board[0].size();string sol = "";for (int i = 0; i < word.size(); i++) {string tmpStr = word.substr(0, i + 1);s.insert(tmpStr);}vector<vector<bool>> visited;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {sol.clear(); //这里每次都要clear!不然后面的操作就append到s上面!visited.resize(m, vector<bool>(n, false));sol += board[i][j];if (check(board, word, sol, visited, i, j)) return true;}}return false;}
private:int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};set<string> s;bool check(vector<vector<char>> &board, string &word, string sol, vector<vector<bool>> &visited, int x, int y) {if (s.find(sol) == s.end()) return false;if (sol == word) {return true;}if (sol.size() >= word.size()) return false;visited[x][y] = true;for (int i = 0; i < 4; i++) {int newX = x + dx[i];int newY = y + dy[i];if (newX >= 0 && newX < board.size() && newY >= 0 && newY < board[0].size() && !visited[newX][newY]) {sol += board[newX][newY];if (check(board, word, sol, visited, newX, newY)) return true;else sol.pop_back();  //这一行重要!因为sol还要被for循环的其它i用到!}}visited[x][y] = false; //这一行重要,只有当dfs能够一直往下进行,visited[][]才不用动,否则如果dfs中途退出,visited[][]要clear。不然就跟后面操作冲突!return false; //这里别忘了,不然默认可能会返回true!!!}
};

二刷:不需要set。每次比较当前位置的字符就可以了。

class Solution {
public:/*** @param board: A list of lists of character* @param word: A string* @return: A boolean*/bool exist(vector<vector<char>> &board, string &word) {int m = board.size();if (m == 0) return word.empty();int n = board[0].size();string sol = "";vector<vector<bool>> visited;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {sol.clear();visited.resize(m, vector<bool>(n, false));sol += board[i][j];if (check(board, word, sol, 0, visited, i, j)) return true;}}return false;}
private:int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};bool check(vector<vector<char>> &board, string &word, string sol, int pos, vector<vector<bool>> &visited, int x, int y) {if (sol[pos] != word[pos]) return false;if (sol == word) {return true;}//if (sol.size() >= word.size()) return false; //这一行不需要!如果不匹配早就返回了,匹配上面也会返回true。visited[x][y] = true;for (int i = 0; i < 4; i++) {int newX = x + dx[i];int newY = y + dy[i];if (newX >= 0 && newX < board.size() && newY >= 0 && newY < board[0].size() && !visited[newX][newY]) {sol += board[newX][newY];if (check(board, word, sol, pos + 1, visited, newX, newY)) return true;else sol.pop_back();  //这一行重要!因为sol还要被for循环的其它i用到!}}visited[x][y] = false; //这一行重要,只有当dfs能够一直往下进行,visited[][]才不用动,否则如果dfs中途退出,visited[][]要clear。不然就跟后面操作冲突!return false;}
};

三刷: DFS+Trie
TBD

四刷:BFS
TBD

http://www.lryc.cn/news/257956.html

相关文章:

  • SpringCloud面试题——Sentinel
  • 【精选】 VulnHub (超详细解题过程)
  • 数据结构与算法-Rust 版读书笔记-2线性数据结构-队列
  • Android Kotlin Viewbinding封装
  • Flutter:web项目跨域问题解决
  • 汽车标定技术(十二)--A2L文件生成的方法
  • 《PySpark大数据分析实战》-03.了解Hive
  • 经验分享|MySQL分区实战(RANGE)
  • Arrays.asList() 和 Collections.singletonList()
  • Firmware Analysis Plus (Fap)固件模拟安装教程(最新)
  • 使用包、Crate 和模块管理项目(上)
  • 【Kotlin】
  • JavaDay17
  • Python爬取酷我音乐
  • 项目实战第四十七讲:易宝支付对接详解(保姆级教程)
  • python的websocket方法教程
  • Qt处理焦点事件(获得焦点,失去焦点)
  • SiteGround如何设置WordPress网站自动更新
  • http代理和SOCK5代理谁更安全?
  • Kotlin关键字二——constructor和init
  • java的long类型超过9位报错:the literal 987654321000 of type int is out of range
  • 【Java期末复习资料】(4)模拟卷
  • 【计算机网络】UDP报文详解
  • 排序算法——归并排序
  • 2023 年安徽省职业院校技能大赛高职组“软件测试”赛项样题
  • Mysql8和Oracle实际项目中递归查询树形结构
  • docker mysql8 设置不区分大小写
  • Audio Siganl (MATLAB) 代码学习—常见问题3
  • 【PTA题目】7-8 矩阵运算 分数 10
  • Ubuntu20.04创建并挂在zfs池