由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - [难题求助] leetcode wordsearch
相关主题
请教Word Search II那题的复杂度leetcode wordSearch 这道题
leetcode wordsearch的时间复杂度?
相关话题的讨论汇总
话题: board话题: visited话题: int
进入JobHunting版参与讨论
1 (共1页)
s*****1
发帖数: 134
1
版上有没有做出leetcode online test 中我的 word search 的 java版,这题我java
版做了,能通过小规模测试,但大规模的通过不了,写了2个版本都超时了。
我的思路和网上搜索的c++版本(通过)的一样,就是一个点开始向四周辐射搜索,类
似于DFS,做DFS是需要一个二维的boolean矩阵来记录这个点是否visit过。我感觉就是
这个环节出了问题,C++深拷贝一个二维矩阵快吧,但是java深拷贝一个二维矩阵很费
时。
我的程序已经有DP和pre-check了,还是不快,望能够写出快速程序的大牛赐教,最好
贴代码 或站内头条,非常感谢!
a***o
发帖数: 1182
2
C++搞个引用就行了,不用深拷贝,java不清楚

java

【在 s*****1 的大作中提到】
: 版上有没有做出leetcode online test 中我的 word search 的 java版,这题我java
: 版做了,能通过小规模测试,但大规模的通过不了,写了2个版本都超时了。
: 我的思路和网上搜索的c++版本(通过)的一样,就是一个点开始向四周辐射搜索,类
: 似于DFS,做DFS是需要一个二维的boolean矩阵来记录这个点是否visit过。我感觉就是
: 这个环节出了问题,C++深拷贝一个二维矩阵快吧,但是java深拷贝一个二维矩阵很费
: 时。
: 我的程序已经有DP和pre-check了,还是不快,望能够写出快速程序的大牛赐教,最好
: 贴代码 或站内头条,非常感谢!

s*****1
发帖数: 134
3
谢谢,关于java的版本,大牛们回应一下吧!
不胜感激~
T**********r
发帖数: 52
4
public boolean exist(char[][] board, String word) {
if(word == null || word.length() == 0){
return true;
}

char c = word.charAt(0);

for(int i = 0; i < board.length; i ++){
for(int j = 0; j < board[i].length; j ++){
if(board[i][j] ==c){

board[i][j] = 0;
if(dfs(board, i, j, word, 1)){
return true;
}
board[i][j] = c;

}
}
}

return false;
}
private boolean dfs(char[][] board, int row, int col, String word, int k) {
if(k == word.length()){
return true;
}

// int[][] dir = { {-1,-1}, {-1,0}, {-1,1}, {0,1}, // for 8
directions
// {1,1},{1,0},{1,-1},{0,-1}};
int[][] dir = { {-1,0}, {0,1}, {1,0},{0,-1}};
char c = word.charAt(k);
int M = board.length;
int N = board[0].length;

for(int[] d : dir){
int i = row + d[0];
int j = col + d[1];

if(0 <= i && i < M && 0 <= j && j < N && board[i][j] == c){
board[i][j] = 0;
if(dfs(board, i, j, word, k+1)){
return true;
}
board[i][j] = c;
}
}
return false;
}
s*****1
发帖数: 134
5
太感谢了!!!牛!!!
x******9
发帖数: 473
6
这个过大集合会超时,求教。
这个确实直接会爆掉
["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","aaaaaaaaaaaaaaaaaaaaaaaaaaaaab"], "
baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"

【在 T**********r 的大作中提到】
: public boolean exist(char[][] board, String word) {
: if(word == null || word.length() == 0){
: return true;
: }
:
: char c = word.charAt(0);
:
: for(int i = 0; i < board.length; i ++){
: for(int j = 0; j < board[i].length; j ++){
: if(board[i][j] ==c){

k*********6
发帖数: 738
7
public class Solution {
public boolean exist(char[][] board, String word) {
// Start typing your Java solution below
// DO NOT write main() function
//DFS
if (word == null || word.length() == 0) return true;
if (board == null || board.length == 0|| board[0].length == 0)
return false;

boolean[][] visited = new boolean[board.length][board[0].length];

for (int i = 0; i < board.length; i++)
{
for(int j = 0; j < board[0].length; j++)
{
if (board[i][j] == word.charAt(0))
{
visited[i][j] = true;
if (dfs(board, word, i, j, 1, visited)) return true;
visited[i][j] = false;
}
}
}
return false;
}

public boolean dfs(char[][] board, String word, int i, int j, int letter
, boolean[][]visited)
{
if (letter == word.length()) return true;
// check all positon around (i, j), to see if it is the same as word
.charAt(letter)
// (i - 1, j), (i + 1, j), (i, j -1), (i , j + 1)
char curr = word.charAt(letter);
if (i - 1 >= 0 && !visited[i -1][j] && board[i -1][j] == curr)
{
visited[i -1][j] = true;
if (dfs(board, word, i -1, j, letter + 1, visited)) return true;
visited[i -1][j] = false;
}
if (i + 1 < board.length &&!visited[i + 1][j] && board[i + 1][j] ==
curr)
{
visited[i + 1][j] = true;
if(dfs(board, word, i + 1, j, letter + 1, visited)) return true;
visited[i + 1][j] = false;
}
if (j - 1 >= 0 && !visited[i][j - 1] && board[i][j - 1] == curr)
{
visited[i][j - 1] = true;
if(dfs(board, word, i, j - 1, letter + 1, visited)) return true;
visited[i][j - 1] = false;
}
if (j + 1 < board[i].length && !visited[i][j + 1] && board[i][j + 1
] == curr)
{
visited[i][j + 1] = true;
if(dfs(board, word, i, j + 1, letter + 1, visited)) return true;
visited[i][j + 1] = false;
}
return false;
}
}

java

【在 s*****1 的大作中提到】
: 版上有没有做出leetcode online test 中我的 word search 的 java版,这题我java
: 版做了,能通过小规模测试,但大规模的通过不了,写了2个版本都超时了。
: 我的思路和网上搜索的c++版本(通过)的一样,就是一个点开始向四周辐射搜索,类
: 似于DFS,做DFS是需要一个二维的boolean矩阵来记录这个点是否visit过。我感觉就是
: 这个环节出了问题,C++深拷贝一个二维矩阵快吧,但是java深拷贝一个二维矩阵很费
: 时。
: 我的程序已经有DP和pre-check了,还是不快,望能够写出快速程序的大牛赐教,最好
: 贴代码 或站内头条,非常感谢!

x******9
发帖数: 473
8
thx.
我的错,和4楼一样,但是在寻找下一层的时候赋值错误,他用的int j=col+d[i],我用
了col=col+d[i],但是进去之前按理说已经置为其他字符了,我再仔细想想其中的区别。

【在 k*********6 的大作中提到】
: public class Solution {
: public boolean exist(char[][] board, String word) {
: // Start typing your Java solution below
: // DO NOT write main() function
: //DFS
: if (word == null || word.length() == 0) return true;
: if (board == null || board.length == 0|| board[0].length == 0)
: return false;
:
: boolean[][] visited = new boolean[board.length][board[0].length];

z****e
发帖数: 54598
9
public class Solution {
public boolean exist(char[][] board, String word) {
// Start typing your Java solution below
// DO NOT write main() function
if(word.length()<1) return false;
for(int i=0;i for(int j=0;j if(board[i][j]==word.charAt(0)){
board[i][j] = ' ';
if(this.existed(board,word.substring(1),i,j)
) return true;
board[i][j] = word.charAt(0);
}
}
}
return false;
}
private boolean existed(char[][] board, String word, int i, int j){
if(word.length()==0) return true;
int[][] m = {{1,0},{-1,0},{0,1},{0,-1}};
for(int k =0;k int ii=m[k][0]+i;
int jj=m[k][1]+j;
if(ii=0
&&jj=0
&&board[ii][jj]==word.charAt(0)){
board[ii][jj] = ' ';
if(existed(board,word.substring(1),ii,jj)) return
true;
board[ii][jj] = word.charAt(0);
}
}
return false;
}
}
c***d
发帖数: 26
10
这题野蛮暴力就能通过大case呀。
public class Solution {
public boolean exist(char[][] board, String word) {
// Start typing your Java solution below
// DO NOT write main() function
if (board==null) return false;
boolean visited[][] = new boolean[board.length][board[0].length];
for(int i = 0; i < board.length; i++) {
for(int j = 0; j < board[0].length; j++) {
if (helper(board, visited, word, i, j, 0)) return true;
}
}
return false;
}
private boolean helper(char[][] board, boolean[][] visited, String word,
int i, int j, int index) {
if (i<0 || i>= board.length || j<0 || j>=board[0].length) return
false;
if (board[i][j] != word.charAt(index)) return false;
if (visited[i][j]) return false;
if (index == word.length() - 1) return true;
visited[i][j] = true;
boolean exist = helper(board, visited, word, i-1, j, index+1)
|| helper(board, visited, word, i, j+1, index+1)
|| helper(board, visited, word, i+1, j, index+1)
|| helper(board, visited, word, i, j-1, index+1);
visited[i][j] = false;
return exist;
}
}

java

【在 s*****1 的大作中提到】
: 版上有没有做出leetcode online test 中我的 word search 的 java版,这题我java
: 版做了,能通过小规模测试,但大规模的通过不了,写了2个版本都超时了。
: 我的思路和网上搜索的c++版本(通过)的一样,就是一个点开始向四周辐射搜索,类
: 似于DFS,做DFS是需要一个二维的boolean矩阵来记录这个点是否visit过。我感觉就是
: 这个环节出了问题,C++深拷贝一个二维矩阵快吧,但是java深拷贝一个二维矩阵很费
: 时。
: 我的程序已经有DP和pre-check了,还是不快,望能够写出快速程序的大牛赐教,最好
: 贴代码 或站内头条,非常感谢!

l*n
发帖数: 529
11
大牛追求就是不一样啊,连memoization都是不浪费空间的。

j)

【在 z****e 的大作中提到】
: public class Solution {
: public boolean exist(char[][] board, String word) {
: // Start typing your Java solution below
: // DO NOT write main() function
: if(word.length()<1) return false;
: for(int i=0;i: for(int j=0;j: if(board[i][j]==word.charAt(0)){
: board[i][j] = ' ';
: if(this.existed(board,word.substring(1),i,j)

1 (共1页)
进入JobHunting版参与讨论
相关主题
请教Word Search II那题的复杂度leetcode wordSearch 这道题
leetcode wordsearch的时间复杂度?
相关话题的讨论汇总
话题: board话题: visited话题: int