博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode]Word Search
阅读量:5126 次
发布时间:2019-06-13

本文共 2497 字,大约阅读时间需要 8 分钟。

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     */

 

转载于:https://www.cnblogs.com/dick159/p/5175639.html

你可能感兴趣的文章
引用 移植Linux到s3c2410上
查看>>
MySQL5.7开多实例指导
查看>>
[51nod] 1199 Money out of Thin Air #线段树+DFS序
查看>>
Red and Black(poj-1979)
查看>>
分布式锁的思路以及实现分析
查看>>
腾讯元对象存储之文件删除
查看>>
jdk环境变量配置
查看>>
安装 Express
查看>>
包含列的索引:SQL Server索引的阶梯级别5
查看>>
myeclipse插件安装
查看>>
浙江省第十二届省赛 Beauty of Array(思维题)
查看>>
NOIP2013 提高组 Day1
查看>>
cocos2dx 3.x simpleAudioEngine 长音效被众多短音效打断问题
查看>>
存储(硬件方面的一些基本术语)
查看>>
观察者模式
查看>>
Weka中数据挖掘与机器学习系列之基本概念(三)
查看>>
Win磁盘MBR转换为GUID
查看>>
大家在做.NET B/S项目的时候多用什么设技术啊?
查看>>
Java SE和Java EE应用的性能调优
查看>>
Android设计模式系列--原型模式
查看>>