String 从给定字符串数组中查找所有子字符串的算法

String 从给定字符串数组中查找所有子字符串的算法,string,algorithm,array-algorithms,string-algorithm,String,Algorithm,Array Algorithms,String Algorithm,我需要从给定的字符串数组中找到所有子字符串并对它们进行分组 附加条件: 如果字符串S1包含字符串S2,S1包含S3,S2包含S4-所有这些字符串都应在一个组中 示例: 给定数组: 你好,你好约翰,你好,你好鲍勃,见鬼,大家好 结果输出: 第一组:你好,你好,约翰,地狱 第二组:嗨,嗨鲍勃,嗨大家 在字符串数组上构建一个 对于每个数组条目,遍历trie,如果当前节点标记了一个单词,则打印它(在与当前字符串相同的组下)。做一些簿记以避免多次打印同一个单词 制造轮胎的时间复杂度为O(|w1|+…+|

我需要从给定的字符串数组中找到所有子字符串并对它们进行分组

附加条件:

如果字符串S1包含字符串S2,S1包含S3,S2包含S4-所有这些字符串都应在一个组中

示例:

给定数组: 你好,你好约翰,你好,你好鲍勃,见鬼,大家好

结果输出:

第一组:你好,你好,约翰,地狱

第二组:嗨,嗨鲍勃,嗨大家
  • 在字符串数组上构建一个
  • 对于每个数组条目,遍历trie,如果当前节点标记了一个单词,则打印它(在与当前字符串相同的组下)。做一些簿记以避免多次打印同一个单词
  • 制造轮胎的时间复杂度为
    O(|w1|+…+|wn|)
    ,其中
    |wi
    是字符串的长度
    wi
    ;所以它是线性的,在字符串长度的总和上。空间复杂度受同一表达式的限制,但当有许多公共前缀时(实际上就是这样),空间复杂度要低得多

    查询步骤的时间复杂度与字符串长度成线性关系——只需遍历与字符串对应的分支即可。(也许你可以标记出你一路上访问过的字符串,并以此作为当前字符串的前缀,这样你以后就不会遍历它们了。首先访问较长的字符串可以帮助你进一步降低时间复杂度。)

    下面是一个让您开始的结构:

    typedef struct node_t_ node_t;
    struct node_t_ {
        node_t c *children[ALPHABET_SIZE];
        char kIsLeaf; // set to 1 if represents a word
        char ch; // character stored in the leaf (redundant)
    }
    
    插入很容易。从存储零字符(表示空字符串)的非空
    根开始

    插入:

     void insert(const char* str) {
        node_t* current = root;
        while (*str != '\0') {
            if (current->children[*str] == NULL) {
                create new node;
            }
            current = current->children[*str++];
        }
        current->kIsLeaf = 1;
    }
    

    其他程序非常相似。Trie是一种非常优雅、易于实现且易于使用的数据结构。

    您有什么问题吗?在我当前的实现(蛮力)中,我面临着N*N复杂性(这是预期的),这不适用于大型数组。但我们应该如何处理“Hello world”、“world”等键?当第一个字符串包含第二个时,它们也应该在一个组中,但是在TIE中它们将在不同的路径中,如果它在中间,例如“hello”和“嗯,你好,那里”?