`
hcx2013
  • 浏览: 88757 次
社区版块
存档分类
最新评论

Word Search II

 
阅读更多

Given a 2D board and a list of words from the dictionary, find all words in the board.

Each word must 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 in a word.

For example,
Given words = ["oath","pea","eat","rain"] and board =

[
  ['o','a','a','n'],
  ['e','t','a','e'],
  ['i','h','k','r'],
  ['i','f','l','v']
]

Return ["eat","oath"].

 

public class Solution {
	Set<String> res = new HashSet<String>();

	public List<String> findWords(char[][] board, String[] words) {
		Trie trie = new Trie();
		for (String word : words) {
			trie.insert(word);
		}

		int m = board.length;
		int n = board[0].length;
		boolean[][] visited = new boolean[m][n];
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				dfs(board, visited, "", i, j, trie);
			}
		}

		return new ArrayList<String>(res);
	}

	public void dfs(char[][] board, boolean[][] visited, String str, int x,
			int y, Trie trie) {
		if (x < 0 || x >= board.length || y < 0 || y >= board[0].length)
			return;
		if (visited[x][y])
			return;

		str += board[x][y];
		if (!trie.startsWith(str))
			return;

		if (trie.search(str)) {
			res.add(str);
		}

		visited[x][y] = true;
		dfs(board, visited, str, x - 1, y, trie);
		dfs(board, visited, str, x + 1, y, trie);
		dfs(board, visited, str, x, y - 1, trie);
		dfs(board, visited, str, x, y + 1, trie);
		visited[x][y] = false;
	}
}

class TrieNode {

	private TrieNode[] nodes;
	private boolean end;

	public TrieNode() {
		int size = 26;
		nodes = new TrieNode[size];
		end = false;
	}

	public void insert(char[] chars, int start) {
		if (start == chars.length) {
			end = true;
			return;
		}
		int idx = chars[start] - 'a';
		TrieNode node = nodes[idx];
		if (node != null) {
			node.insert(chars, start + 1);
		} else {
			node = new TrieNode();
			nodes[chars[start] - 'a'] = node;
			node.insert(chars, start + 1);
		}
	}

	public boolean search(char[] chars, int start) {
		if (start == chars.length) {
			return end;
		}
		char c = chars[start];
		TrieNode node = nodes[c - 'a'];
		if (node == null) {
			return false;
		}
		return node.search(chars, start + 1);
	}

	public boolean startWith(char[] chars, int start) {
		if (start == chars.length) {
			return true;
		}
		char c = chars[start];
		TrieNode node = nodes[c - 'a'];
		if (node == null) {
			return false;
		}
		return node.startWith(chars, start + 1);
	}
}

class Trie {
	private TrieNode root;

	public Trie() {
		root = new TrieNode();
	}

	// Inserts a word into the trie.
	public void insert(String word) {
		root.insert(word.toCharArray(), 0);
	}

	// Returns if the word is in the trie.
	public boolean search(String word) {
		return root.search(word.toCharArray(), 0);
	}

	// Returns if there is any word in the trie
	// that starts with the given prefix.
	public boolean startsWith(String prefix) {
		return root.startWith(prefix.toCharArray(), 0);
	}
}

 

4
3
分享到:
评论

相关推荐

    word search

    【标题】"word search"指的是在大量文本中查找并替换特定单词或短语的功能,它在IT行业中常常被用于文档处理和数据清洗。这个工具帮助用户高效地批量更改文本内容,节省了手动操作的时间和精力。 【描述】"用于文本...

    WordSearch

    This utility as designed to aid in the generation of a word search puzzle, which can be very time consuming to the puzzle creator from the point of layout and then finally randomly filling in the ...

    word search puzzle

    《Word Search Puzzle: 探索字符串匹配的魅力》 在信息技术领域,我们经常遇到各种各样的问题,其中之一就是字符串匹配。这个话题与我们的日常生活息息相关,比如搜索引擎如何快速找到我们输入的关键字,或者在文本...

    Elasticsearch Demo 读取word内容写入到Es上并展示在WebFrom页面上

    在这个"Elasticsearch Demo"项目中,我们将学习如何将Word文档的内容读取并写入Elasticsearch,以及如何在WebForm页面上展示搜索结果,并实现关键词高亮显示。 首先,我们需要了解**数据导入过程**。在本示例中,...

    WordSearch.java

    WordSearch.java

    wordsearch.py

    wordsearch.py

    wordsearch.exe

    wordsearch.exe

    WordSearch.zip

    WordSearch.zip 文件看起来是一个压缩包,里面包含了一个名为 "WordSearch" 的文件。根据文件名推测,这可能是一个关于单词搜索谜题或者相关的文本处理工具。在IT领域,单词搜索通常与编程、文本分析和数据处理相关...

    Wordsearch-Solver-Python:简单的Wordsearch解决Python脚本

    Wordsearch解算器Python 首先,它要求一个包含单词搜索的文本文件。 然后,它将数据导入到数组中。 用户输入他们要查找的单词,然后打印单词搜索并突出显示该单词,因此您可以清楚地看到其位置。 查找单词的算法...

    SearchWord

    用二叉树法统计文本文件的各单词的出现数目,并按单词顺序写入到另一个文件存储

    WordSearch_java_

    标题“WordSearch_java_”指的是一个使用Java编程语言实现的英文单词搜索程序。这个程序可能是一个简单的命令行应用,也可能包含图形用户界面,用于在用户提供的词库中查找指定的单词。下面将详细讨论Java编程语言、...

    WordSearch Creator-开源

    【WordSearch Creator 开源项目详解】 WordSearch Creator 是一个开源的程序,用于生成纵横字谜游戏,也称为单词搜索游戏。这种类型的游戏通常在教育环境中使用,帮助学习者提高词汇量和拼写能力,同时也是一种休闲...

    springboot+es实现对word,pdf,txt等文件的非结构化数据全文内容检索

    在现代的信息化环境中,非结构化数据如Word文档、PDF和TXT文本的处理变得日益重要。Spring Boot结合Elasticsearch的解决方案为这类问题提供了一种高效且灵活的途径。本教程将详细介绍如何利用Spring Boot集成Elastic...

    elasticsearch-analysis-ik-7.10.0.zip下载

    8. config:这个目录可能包含了IK分词器的配置文件,如ik_max_word.txt和ik_smart.txt,用户可以通过修改这些文件调整分词器的行为,比如自定义停用词或者词典。 安装IK分词器通常需要将jar文件复制到Elasticsearch...

    Unity3d Word Search Cookies 3.5 英文单词拼写益智小游戏源码

    本项目"Word Search Cookies 3.5"是一个基于Unity3D的英文单词拼写益智小游戏,旨在帮助玩家在娱乐中提升英语词汇量。 首先,我们要理解C#语言在Unity中的角色。C#是Unity的主要编程语言,它允许开发者通过编写代码...

    WordSearch_java_源码.zip

    标题中的"WordSearch_java_源码.zip"表明这是一个关于Java编程的项目,具体实现了一个单词搜索(WordSearch)的功能。通常,这样的项目可能是一个简单的文本游戏,用户可以在一个给定的字母网格中寻找隐藏的单词。这...

    pdf转word工具(本人见过的最好用的pdf2word工具)

    PDF转Word工具是一种软件或在线服务,专门设计用于将PDF(Portable Document Format)文件转换成Word(.doc或.docx)格式。这种转换对于编辑、重新格式化或在不支持PDF格式的应用中使用文档非常有用。PDF文件通常...

    C语言单词匹配矩阵- Word Search Puzzle

    在本项目中,我们探讨的是一个使用C语言编写的Word Search Puzzle游戏。这个游戏是一个经典的单词查找挑战,它涉及到了编程中的几个关键知识点,包括字符串处理、数组操作、随机数生成以及用户交互等。 首先,我们...

    1、基础算法必练题(含解法)).pdf

    7. **Word Search II**:在一个二维字符网格中找出所有具有给定模式的单词。这涉及深度优先搜索(DFS)或广度优先搜索(BFS)策略。 8. **Find the Difference**:找出两个字符串的唯一差异。使用异或运算即可轻松...

Global site tag (gtag.js) - Google Analytics