您的位置:首页 > 其它

[LeetCode]Word Search

2016-02-01 16:18 155 查看
Given a 2D board and a word, find if the word exists in the grid.

The 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.

For example,

Given board =

[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]

word =
"ABCCED"
, -> returns
true
,

word =
"SEE"
, -> returns
true
,

word =
"ABCB"
, -> returns
false
.

题目的意思很明白了,一般的搜索题,剪枝下就好,不过这题我刚开始做的时候比较笨,开了块内存boolea[][] visited来标记是访问,但是忘记了数据比较多的时候每次的寻址时间开销很大。导致TLE了,经过改进,使用了标记-复原的方法,就省了新开辟内存的开销了。

(注意:需要复原原始访问位,不然当访问失败时,下次访问的时候就没得搞了。)

上代码了。

import java.util.Scanner;

public class Solution {

public boolean exist( char[][] board, String word ) {
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 ) {
if(search( i, j, board, word, 0 )) {
return true;
}
}
}
}
return false;
}

public boolean search( int x, int y, char[][] board, String word, int k) {
if( k>=word.length() ) {
return true;
}

if(x < 0 || x >= board.length || y < 0 || y >= board[ 0 ].length){
return false;
}
char ch = word.charAt( k );
if(ch == board[x][y]){
board[x][y] = '*';
if(search( x+1, y, board, word, k+1 ) || search( x-1, y, board, word, k+1 ) || search( x, y+1, board, word, k+1 ) || search( x, y-1, board, word, k+1 )){
return true;
}
board[x][y] = ch;
}
return false;
}

public static void main( String[] args ) {
// TODO Auto-generated method stub
Solution s = new Solution();
Scanner sc = new Scanner( System.in );
String word = "ghi";
while( sc.hasNext() ) {
int w = sc.nextInt();
int h = sc.nextInt();
char[][] board = new char[ w ][ h ];
for( int i = 0; i < w; i++ ) {
for( int j = 0; j < h; j++ ) {
String temp = sc.next();
board[ i ][ j ] = temp.charAt( 0 );
}
}
System.out.println( s.exist( board, word ) );
}
}

/*
* 3 3
a b c
d e f
g h i
4 4
a b c d
e f g h
i j k l
m n o p
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: