using
System;
class
GFG
{
static
int
ALPHABET_SIZE = 26;
class
TrieNode
{
public
TrieNode []children =
new
TrieNode[ALPHABET_SIZE];
public
bool
isEndOfWord;
public
TrieNode()
{
}
};
static
TrieNode getNode()
{
TrieNode pNode =
new
TrieNode();
pNode.isEndOfWord =
false
;
for
(
int
i = 0; i < ALPHABET_SIZE; i++)
pNode.children[i] =
null
;
return
pNode;
}
static
void
insert(TrieNode root, String key)
{
TrieNode pCrawl = root;
for
(
int
i = 0; i < key.Length; i++)
{
int
index = key[i] -
'a'
;
if
(pCrawl.children[index] ==
null
)
pCrawl.children[index] = getNode();
pCrawl = pCrawl.children[index];
}
pCrawl.isEndOfWord =
true
;
}
static
bool
search(TrieNode root, String key)
{
TrieNode pCrawl = root;
for
(
int
i = 0; i < key.Length; i++)
{
int
index = key[i] -
'a'
;
if
(pCrawl.children[index] ==
null
)
return
false
;
pCrawl = pCrawl.children[index];
}
return
(pCrawl !=
null
&& pCrawl.isEndOfWord);
}
static
void
wordBreakAll(TrieNode root,
String word,
int
n, String result)
{
for
(
int
i = 1; i <= n; i++)
{
String prefix = word.Substring(0, i);
if
(search(root, prefix))
{
if
(i == n)
{
result += prefix;
Console.Write(
"\t"
+ result +
"\n"
);
return
;
}
wordBreakAll(root, word.Substring(i, n - i), n - i,
result + prefix +
" "
);
}
}
}
public
static
void
Main(String[] args)
{
new
TrieNode();
TrieNode root = getNode();
String []dictionary = {
"sam"
,
"sung"
,
"samsung"
};
int
n = dictionary.Length;
for
(
int
i = 0; i < n; i++)
{
insert(root, dictionary[i]);
}
for
(
int
i = 0; i < n; i++)
{
Console.Write(dictionary[i]+
": \n"
);
wordBreakAll(root, dictionary[i],
dictionary[i].Length,
""
);
}
}
}