由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - amazon面试题目讨论贴2
相关主题
谁能写个trie的框架?boggle game是不是只有backtracking的解法?
一道MS题现在出发去F onsite
急问,Boggle (crossword)的解题思路?boggle那个题
rejected by facebook after 2nd phone interviewboggle的复杂度
新鲜onsite面经请教:boggle puzzle找所有的单词,怎么做?
什么时候用SUFFIX TREE,什么时候用TRIE请教个prefix tree (trie)和boggle的问题
问一个boggle题的扩展面试的时候用到Trie,要求实现吗?
谁来说说Boggle这题的考点在哪里?A家onsite, OO答的真郁闷
相关话题的讨论汇总
话题: trie话题: used话题: int话题: buffidx话题: buff
进入JobHunting版参与讨论
1 (共1页)
s*******n
发帖数: 97
1
题目2:
boggle puzzle 找到里面所有的单词,写code
DFS?
g*********e
发帖数: 14401
2
是吧 还需要一个矩阵记录某个位置是否已经走过了
s*******n
发帖数: 97
3
SURE, IT IS RIGHT..
g**********y
发帖数: 14569
4
public class Boggle {
private final int N = 5;
private HashSet m_words;

public Boggle() {
m_words = new HashSet();
}

public static void main(String[] args) {
String[] str = new String[]{
"AEBOF", "TSUVW", "RFOEG", "RSOFI", "PQWRE"
};
new Boggle().run(str);
}

public void run(String[] str) {
char[][] cs = new char[N][N];
boolean[][] used = new boolean[N][N];
m_words.clear();

Trie trie = new Trie();
String dictionary = FileHelper.readFile("src/test/resources/english-
dict.txt");
for (String word : dictionary.split("\n")) {
if (word.length() > 0) trie.addWord(word.toLowerCase());
}

for (int i=0; i cs[i] = str[i].toLowerCase().toCharArray();
}

for (int i=0; i for (int j=0; j dfs("", cs, i, j, used, trie);
}
}

System.out.println("Find " + m_words.size() + " words.");
}

private void dfs(String cur, char[][] cs, int i, int j, boolean[][] used
, Trie node) {
if (i<0 || i>N-1 || j<0 || j>N-1 || used[i][j]) return;
String next = cur + cs[i][j];
node = node.getNode(cs[i][j]);
if (node == null) return;

used[i][j] = true;
if (node.isWord() && !m_words.contains(next)) {
m_words.add(next);
System.out.println(next);
}

dfs(next, cs, i-1, j-1, used, node);
dfs(next, cs, i, j-1, used, node);
dfs(next, cs, i+1, j-1, used, node);
dfs(next, cs, i-1, j, used, node);
dfs(next, cs, i+1, j, used, node);
dfs(next, cs, i-1, j+1, used, node);
dfs(next, cs, i, j+1, used, node);
dfs(next, cs, i+1, j+1, used, node);
used[i][j] = false;
}
}
l*****a
发帖数: 14598
5
a little optimization
for(int m=-1;m<=1;m++)
for(int n=-1;n<=1;n++)
{
if(m==0&&n==0)continue;
dfs(...,i+m,j+n,,,,,);
}

【在 g**********y 的大作中提到】
: public class Boggle {
: private final int N = 5;
: private HashSet m_words;
:
: public Boggle() {
: m_words = new HashSet();
: }
:
: public static void main(String[] args) {
: String[] str = new String[]{

f*******t
发帖数: 7549
6
#include
#include
#include
#define ENTRYNOTFOUND 0
#define ENTRYFOUND 1
#define NOTCOMPLETE 2
struct Trie;
void FindWords(Trie *root);
struct Trie
{
Trie();
~Trie();
Trie *children[26];
bool isEnd;
};
Trie::Trie()
{
for(int i = 0; i < 26; i++)
children[i] = NULL;
isEnd = false;
}
Trie::~Trie()
{
for(int i = 0; i < 26; i++) {
if(children[i]) {
delete children[i];
children[i] = NULL;
}
}
}
void TrieInsert(Trie *root, const char *str)
{
if(!str || *str < 'a' || *str > 'z') {
printf("Invalid line\n");
return;
}

Trie *cur = root;
while(*str >= 'a' && *str <= 'z') {
int index = (int)(*str - 'a');
if(cur->children[index] == NULL) {
cur->children[index] = new Trie();
}
cur = cur->children[index];

str++;
}

if(cur != root)
cur->isEnd = true;
}
int TrieSearch(Trie *root, const char *str)
{
if(!str || *str < 'a' || *str > 'z') {
printf("Invalid string!\n");
return ENTRYNOTFOUND;
}

printf("Looking for word %s\n", str);

Trie *cur = root;
while(*str >= 'a' && *str <= 'z') {
int index = (int)(*str - 'a');
if(cur->children[index]) {
cur = cur->children[index];
str++;
}
else
return ENTRYNOTFOUND;
}

if(cur != root && cur->isEnd)
return ENTRYFOUND;
else
return NOTCOMPLETE;
}
int main()
{
Trie *root = new Trie();

FILE *fp = fopen("dictionary.txt", "r");
if(!fp) {
printf("Cannot find dictionary file\n");
exit(-1);
}

char buff[32];
int count = 0;
while(fgets(buff, 31, fp) != NULL) {
TrieInsert(root, buff);
memset(buff, 0, 32);
count++;
}
fclose(fp);
printf("Loaded %d words\n", count);

FindWords(root);

delete root;

return 0;
}
#define WIDTH 4
#define HEIGHT 4
bool isValidIndex(int x, int y, bool used[HEIGHT][WIDTH])
{
if(x >= 0 && x < WIDTH && y >= 0 && y < HEIGHT && !used[y][x])
return true;
else
return false;
}
void dfsWord(Trie *root, char *buff, int buffidx, char matrix[HEIGHT][WIDTH]
, bool used[HEIGHT][WIDTH], int x, int y)
{
/*
if(buffidx > 0)
printf("Current buffer: %s\n", buff);
*/
buff[buffidx] = matrix[y][x];
used[y][x] = true;

int status = TrieSearch(root, buff);
if(status != ENTRYNOTFOUND) {
if(status == ENTRYFOUND)
printf("Found word: %s\n", buff);

if(isValidIndex(x-1, y, used))
dfsWord(root, buff, buffidx+1, matrix, used, x-1, y);
if(isValidIndex(x-1, y-1, used))
dfsWord(root, buff, buffidx+1, matrix, used, x-1, y-1);
if(isValidIndex(x, y-1, used))
dfsWord(root, buff, buffidx+1, matrix, used, x, y-1);
if(isValidIndex(x+1, y-1, used))
dfsWord(root, buff, buffidx+1, matrix, used, x+1, y-1);
if(isValidIndex(x+1, y, used))
dfsWord(root, buff, buffidx+1, matrix, used, x+1, y);
if(isValidIndex(x+1, y+1, used))
dfsWord(root, buff, buffidx+1, matrix, used, x+1, y+1);
if(isValidIndex(x, y+1, used))
dfsWord(root, buff, buffidx+1, matrix, used, x, y+1);
if(isValidIndex(x-1, y+1, used))
dfsWord(root, buff, buffidx+1, matrix, used, x-1, y+1);
}
buff[buffidx] = 0;
used[y][x] = false;
}
void FindWords(Trie *root)
{
char matrix[HEIGHT][WIDTH] = {
{'t', 'e', 'g', 's'},
{'r', 'e', 'i', 't'},
{'n', 'i', 'f', 'o'},
{'g', 'l', 'k', 'c'},
};
bool used[HEIGHT][WIDTH];
for(int i = 0; i < HEIGHT; i++) {
for(int j = 0; j < WIDTH; j++) {
used[i][j] = false;
}
}

int tempx, tempy;
char buff[32];
int buffidx;
bool noValidChoice;
for(int y = 0; y < HEIGHT; y++) {
for(int x = 0; x < WIDTH; x++) {
memset(buff, 0, 32);
buffidx = 0;
dfsWord(root, buff, buffidx, matrix, used, x, y);
}
}
}
s*******n
发帖数: 97
7
both solution and optimization are nice...thanks..

【在 l*****a 的大作中提到】
: a little optimization
: for(int m=-1;m<=1;m++)
: for(int n=-1;n<=1;n++)
: {
: if(m==0&&n==0)continue;
: dfs(...,i+m,j+n,,,,,);
: }

s*******n
发帖数: 97
8
good to learn..thanks..

【在 f*******t 的大作中提到】
: #include
: #include
: #include
: #define ENTRYNOTFOUND 0
: #define ENTRYFOUND 1
: #define NOTCOMPLETE 2
: struct Trie;
: void FindWords(Trie *root);
: struct Trie
: {

1 (共1页)
进入JobHunting版参与讨论
相关主题
A家onsite, OO答的真郁闷新鲜onsite面经
Leetcode Word Break I 有o(n^2)的算法吗?什么时候用SUFFIX TREE,什么时候用TRIE
G的youtube组是不是水很深?问一个boggle题的扩展
large file的一道题谁来说说Boggle这题的考点在哪里?
谁能写个trie的框架?boggle game是不是只有backtracking的解法?
一道MS题现在出发去F onsite
急问,Boggle (crossword)的解题思路?boggle那个题
rejected by facebook after 2nd phone interviewboggle的复杂度
相关话题的讨论汇总
话题: trie话题: used话题: int话题: buffidx话题: buff