以反向字典顺序打印字符串
原文:
trie 是一种高效的信息检索数据结构。使用 trie,搜索复杂性可以达到最佳极限。 给一串弦。任务是使用 以相反的字典顺序打印所有字符串。如果输入数组中有重复项,我们只需要打印一次。
示例:
input: str = {"cat", "there", "caller", "their", "calling"}
output: there
their
cat
calling
caller
root
/ \
c t
| |
a h
| \ |
l t e
| | \
l i r
| \ | |
e i r e
| |
r n
|
g
input: str = {"candy", "cat", "caller", "calling"}
output: cat
candy
calling
caller
root
|
c
|
a
/ | \
l n t
| |
l d
| \ |
e i y
| |
r n
|
g
进场:
为了解决上面提到的问题,首先,使用所有字符串构造一个 trie,然后从上到下打印一串最右边的子树,然后从上到下打印一串第二个右子树,然后打印第三个右子树,以此类推。它类似于从右到左的树的遍历。
下面是上述方法的实现:
c
// c program to print array of string
// in reverse dictionary order using trie
#include
using namespace std;
#define children 26
#define max 100
// trie node
struct trie {
trie* child[children];
// endofword is true
// if the node represents
// end of a word
bool endofword;
};
// function will return
// the new node initialized null
trie* createnode()
{
trie* temp = new trie();
temp->endofword = false;
for (int i = 0; i < children; i ) {
// initialize null to the all child
temp->child[i] = null;
}
return temp;
}
// function will insert the
// string in a trie recursively
void insertrecursively(trie* itr,
string str, int i)
{
if (i < str.length()) {
int index = str[i] - 'a';
if (itr->child[index] == null) {
// create a new node
itr->child[index] = createnode();
}
// recursive call for insertion of string
insertrecursively(itr->child[index], str, i 1);
}
else {
// make the endofword
// true which represents
// the end of string
itr->endofword = true;
}
}
// function call to insert a string
void insert(trie* itr, string str)
{
// function call with necessary arguments
insertrecursively(itr, str, 0);
}
// function to check whether the node is leaf or not
bool isleafnode(trie* root)
{
return root->endofword != false;
}
// function to display the content of trie
void displaycontent(trie* root, char str[], int level)
{
// if node is leaf node, it indicates end
// of string, so a null character is added
// and string is displayed
if (isleafnode(root)) {
// assign a null character in temporary string
str[level] = '\0';
cout << str << endl;
}
for (int i = children - 1; i >= 0; i--) {
// check if non null child is found
// add parent key to str and
// call the display function recursively
// for child node
if (root->child[i]) {
str[level] = i 'a';
displaycontent(root->child[i], str, level 1);
}
}
}
// function call for displaying content
void display(trie* itr)
{
int level = 0;
char str[max];
displaycontent(itr, str, level);
}
// driver code
int main()
{
trie* root = createnode();
insert(root, "their");
insert(root, "there");
insert(root, "answer");
insert(root, "any");
/* after inserting strings, trie will look like
root
/ \
a t
| |
n h
| \ |
s y e
| | \
w i r
| | |
e r e
|
r
*/
display(root);
return 0;
}
python 3
# python3 program to print array of string
# in reverse dictionary order using trie
children = 26
max = 100
# trie node
class trie:
def __init__(self):
self.child = [0 for i in range(children)]
# endofword is true
# if the node represents
# end of a word
self.endofword = false;
# function will return
# the new node initialized none
def createnode():
temp = trie();
temp.endofword = false;
for i in range(children):
# initialize null to the all child
temp.child[i] = none;
return temp;
# function will insert the
# string in a trie recursively
def insertrecursively(itr, str, i):
if (i < len(str)):
index = ord(str[i]) - ord('a');
if (itr.child[index] == none):
# create a new node
itr.child[index] = createnode();
# recursive call for insertion of string
insertrecursively(itr.child[index], str, i 1);
else:
# make the endofword
# true which represents
# the end of string
itr.endofword = true;
# function call to insert a string
def insert(itr, str):
# function call with necessary arguments
insertrecursively(itr, str, 0);
# function to check whether the node is leaf or not
def isleafnode(root):
return root.endofword != false;
# function to display the content of trie
def displaycontent(root, str, level):
# if node is leaf node, it indicates end
# of string, so a null character is added
# and string is displayed
if (isleafnode(root)):
# assign a null character in temporary string
print("".join(str[:level]))
for i in range(children-1, -1, -1):
# check if non none child is found
# add parent key to str and
# call the display function recursively
# for child node
if (root.child[i]):
str[level] = chr(i ord('a'));
displaycontent(root.child[i], str, level 1);
# function call for displaying content
def display(itr):
level = 0;
str = ['' for i in range(max)];
displaycontent(itr, str, level);
# driver code
if __name__=='__main__':
root = createnode();
insert(root, "their");
insert(root, "there");
insert(root, "answer");
insert(root, "any");
''' after inserting strings, trie will look like
root
/ \
a t
| |
n h
| \ |
s y e
| | \
w i r
| | |
e r e
|
r
'''
display(root);
# this code is contributed by rutvik_56
output:
there
their
any
answer
麻将胡了pg电子网站的版权属于:月萌api www.moonapi.com,转载请注明出处