当前位置: 首页 > article >正文

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;
}

http://www.kler.cn/news/342299.html

相关文章:

  • Vxe UI vue vxe-table select 下拉框选项列表数据量超大过大时卡顿解决方法
  • Ruby脚本:自动化网页图像下载的实践案例
  • MVS海康工业相机达不到标称最大帧率
  • React 为什么 “虚拟 DOM 顶部有很多 provider“?
  • Halcon OCR字符识别
  • 探索Semantic Kernel:开启AI编程新篇章(入门篇)
  • java连接mysql查询数据(基础版,无框架)
  • 【idea】切换多个仓库到一个分支
  • django中wsgi.py 和 manage.py有什么区别
  • 汽车3d动效的作用!云渲染实现3d动效
  • GC1277和灿瑞的OCH477优势分析 可以用于电脑散热风扇,视频监控和图像处理的图像信号处理器中
  • LlamaIndex 结构化数据库交互指南增强(text2sql)
  • 自动化测试 | 窗口截图
  • 如何设计一个低成本数据归档及查询的架构
  • Cursor AI编辑器:开发效率提升利器
  • Unity网络开发 - C#开源网络通信库PESocket的使用
  • crossover和虚拟机哪个好用?Mac电脑玩游戏用哪个软件?
  • 前端面试题(十三)
  • js中的事件冒泡是什么?
  • JavaScript全局函数研究_手写模仿实现_01:eval、isFinite、isNaN、parseFloat、parseInt