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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!