C语言 | Leetcode C语言题解之第472题连接词

题目:

题解:

typedef struct Trie {
    struct Trie * children[26];
    bool isEnd;
}Trie;

#define TRIE_INITIAL(node) do { \
    for (int i = 0; i < 26; ++i) { \
        (node)->children[i] = NULL; \
    } \
    (node)->isEnd = false; \
}while(0);

static void freeTrie(Trie * node) {
    if (NULL == node) {
        return;
    }
    for (int i = 0; i < 26; ++i) {
        if (node->children[i] != NULL) {
            freeTrie(node->children[i]);
        }
    }
    free(node);
}

static int cmp(const void * pa, const void * pb){
    int la = strlen(*(char **)pa);
    int lb = strlen(*(char **)pb);
    return la - lb;
}

bool dfs(Trie * trie, const char * word, int wordSize, int start, int* visited) {
    if (wordSize == start) {
        return true;
    }
    if (visited[start]) {
        return false;
    }
    visited[start] = 1;
    Trie * node = trie;
    for (int i = start; i < wordSize; i++) {
        char ch = word[i];
        int index = ch - 'a';
        node = node->children[index];
        if (node == NULL) {
            return false;
        }
        if (node->isEnd) {
            if (dfs(trie, word, wordSize, i + 1, visited)) {
                return true;
            }
        }
    }
    return false;
}

void insert(Trie * trie, const char * word, int wordSize) {
    Trie * node = trie;
    for (int i = 0; i < wordSize; i++) {
        char ch = word[i];
        int index = ch - 'a';
        if (node->children[index] == NULL) {
            node->children[index] = (Trie *)malloc(sizeof(Trie));
            TRIE_INITIAL(node->children[index]);
        }
        node = node->children[index];
    }
    node->isEnd = true;
}

char ** findAllConcatenatedWordsInADict(char ** words, int wordsSize, int* returnSize){    
    int pos = 0;
    char ** ans = (char **)malloc(sizeof(char *) * wordsSize);
    Trie * trie = (Trie *)malloc(sizeof(Trie));

    TRIE_INITIAL(trie);
    qsort(words, wordsSize, sizeof(char *), cmp);
    for (int i = 0; i < wordsSize; i++) {
        int len = strlen(words[i]);
        if (len == 0) {
            continue;
        }
        int * visited = (int *)malloc(sizeof(int) * len);
        memset(visited, 0, sizeof(int) * len);
        if (dfs(trie, words[i], len, 0, visited)) {
            ans[pos] = (char *)malloc(sizeof(char) * (len + 1));
            strncpy(ans[pos], words[i], len);
            ans[pos][len] = '\0';
            pos++;
        } else {
            insert(trie, words[i], len);
        }
        free(visited);
    }
    freeTrie(trie);
    *returnSize = pos;
    return ans;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值