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