leetcode(리트코드)79-Search Word
leetcode(리트코드)79-Search Word
leetcode 79 - Search Word 문제입니다.
1. 문제
https://leetcode.com/problems/word-search/
2. Input , Output
3. 분류 및 난이도
Medium 난이도 문제입니다.
leetcode Top 100 Liked 문제입니다.
4. 문제 해석
- board에 있는 문자를 연결하여 주어진 문자열을 만들 수 있는지 확인합니다.
- string의 제한이 클 수도 있고 board의 크기도 거의 무제한일 수 있으므로 이 부분에 유의해야합니다.
- c++은 제가 작성한 코드지만, board의 크기를 지정해버려서 좋은 코드가 아닙니다. python으로 옮기기에 비효율적이라 python은 다른사람들의 코드를 긁어왔습니다.
5. code
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution:
def exist(self, board, word):
if not board:
return False
for i in xrange(len(board)):
for j in xrange(len(board[0])):
if self.dfs(board, i, j, word):
return True
return False
# check whether can find word, start at (i,j) position
def dfs(self, board, i, j, word):
if len(word) == 0: # all the characters are checked
return True
if i<0 or i>=len(board) or j<0 or j>=len(board[0]) or word[0]!=board[i][j]:
return False
tmp = board[i][j] # first character is found, check the remaining part
board[i][j] = "#" # avoid visit agian
# check whether can find "word" along one direction
res = self.dfs(board, i+1, j, word[1:]) or self.dfs(board, i-1, j, word[1:]) \
or self.dfs(board, i, j+1, word[1:]) or self.dfs(board, i, j-1, word[1:])
board[i][j] = tmp
return res
c++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
int dx[4] = {-1,0,1,0};
int dy[4] = {0,-1,0,1};
bool v[200][200] ={0,};
class Solution {
public:
bool DFS(int x,int y,vector<vector<char>>& board,int m,int n,string word,int depth)
{
if(depth == word.size()-1 )
{
if(board[x][y] == word[depth])
return true;
else
return false;
}
for(int k = 0;k<4;++k)
{
int newX = x + dx[k];
int newY = y + dy[k];
if(0<=newX && newX<m && 0<=newY && newY<n && board[newX][newY] == word[depth+1] && !v[newX][newY])
{
//cout<<newX<<newY<<board[newX][newY]<<" "<<depth<<'\n';
v[newX][newY] = true;
if(DFS(newX,newY,board,m,n,word,depth+1))
return true;
v[newX][newY]=false;
}
}
return false;
}
bool exist(vector<vector<char>>& board, string word) {
//DFS
int row = board.size();
int col = board[0].size();
if(row * col < word.size())
return false;
for(size_t i = 0;i<row;++i)
{
for(size_t j = 0 ; j<col;++j)
{
memset(v,false,sizeof(v));
if(board[i][j] == word[0])
{
v[i][j]=true;
if(DFS(i,j,board,row,col,word,0))
return true;
}
}
}
return false;
}
};
6. 결과 및 후기, 개선점
c++ 100% 12ms code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
if(board.empty()) return false;
h = board.size();
w = board[0].size();
for(int i = 0; i<h; ++i) {
for(int j = 0; j<w; ++j)
if(search(board, word, 0, i, j)) return true;
}
return false;
}
private:
int w, h;
bool search(vector<vector<char>>& board, string& word, int d, int i, int j) {
if(i<0 || j<0 || i>=h || j>=w || board[i][j]!=word[d]) return false;
if(d == word.size()-1) return true;
char cur = board[i][j];
board[i][j] = '0';
bool found = search(board, word, d+1, i+1, j)
|| search(board, word, d+1, i-1, j)
|| search(board, word, d+1, i, j+1)
|| search(board, word, d+1, i, j-1);
board[i][j] = cur;
return found;
}
};
방문처리를 임시 값인 ‘0’로 대체하여 풀었고 로직은 비슷합니다..
This post is licensed under CC BY 4.0 by the author.