以反向字典顺序打印字符串

原文:

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