import
java.io.*;
import
java.util.Arrays;
class
TrieNode {
private
TrieNode[] children;
private
boolean
isEndOfWord;
public
TrieNode() {
children =
new
TrieNode[
26
];
Arrays.fill(children,
null
);
isEndOfWord =
false
;
}
public
TrieNode[] getChildren() {
return
children;
}
public
boolean
isEndOfWord() {
return
isEndOfWord;
}
public
void
setEndOfWord(
boolean
endOfWord) {
isEndOfWord = endOfWord;
}
}
class
Trie {
private
TrieNode root;
public
Trie() {
root =
new
TrieNode();
}
public
void
insert(String word) {
TrieNode current = root;
for
(
char
c : word.toCharArray()) {
int
index = c -
'a'
;
if
(current.getChildren()[index] ==
null
) {
current.getChildren()[index] =
new
TrieNode();
}
current = current.getChildren()[index];
}
current.setEndOfWord(
true
);
}
public
boolean
search(String word) {
TrieNode current = root;
for
(
char
c : word.toCharArray()) {
int
index = c -
'a'
;
if
(current.getChildren()[index] ==
null
) {
return
false
;
}
current = current.getChildren()[index];
}
return
current.isEndOfWord();
}
}
public
class
WordSearchIn2DArray {
public
static
int
countWordsIn2DArray(String[] grid, String word) {
int
rows = grid.length;
int
cols = grid[
0
].length();
int
count =
0
;
Trie trie =
new
Trie();
trie.insert(word);
for
(
int
i =
0
; i < rows; i++) {
for
(
int
j =
0
; j < cols; j++) {
StringBuilder current =
new
StringBuilder();
for
(
int
k = j; k < cols; k++) {
current.append(grid[i].charAt(k));
if
(trie.search(current.toString())) {
count++;
}
}
}
}
return
count;
}
public
static
void
main(String[] args) {
String[] grid = {
"abcde"
,
"fghij"
,
"xyabc"
,
"klmno"
};
String word =
"abc"
;
int
result = countWordsIn2DArray(grid, word);
System.out.println(result);
}
}