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

C语言 | Leetcode C语言题解之第459题重复的子字符串

题目:

题解:

bool kmp(char* query, char* pattern) {
    int n = strlen(query);
    int m = strlen(pattern);
    int fail[m];
    memset(fail, -1, sizeof(fail));
    for (int i = 1; i < m; ++i) {
        int j = fail[i - 1];
        while (j != -1 && pattern[j + 1] != pattern[i]) {
            j = fail[j];
        }
        if (pattern[j + 1] == pattern[i]) {
            fail[i] = j + 1;
        }
    }
    int match = -1;
    for (int i = 1; i < n - 1; ++i) {
        while (match != -1 && pattern[match + 1] != query[i]) {
            match = fail[match];
        }
        if (pattern[match + 1] == query[i]) {
            ++match;
            if (match == m - 1) {
                return true;
            }
        }
    }
    return false;
}

bool repeatedSubstringPattern(char* s) {
    int n = strlen(s);
    char k[2 * n + 1];
    k[0] = 0;
    strcat(k, s);
    strcat(k, s);
    return kmp(k, s);
}

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

相关文章:

  • 一文看懂计算机中的大小端(Endianess)
  • HCIP-HarmonyOS Application Developer 习题(六)
  • PHP如何解析配置文件
  • 《Linux从小白到高手》理论篇:Linux的时间管理运行级别启动过程原理详解
  • 算法与程序课程设计——观光铁路
  • 【Blender Python】1.概述和基础使用
  • Docker 部署 Prometheus+Grafana 监控系统快速指南
  • 对象的概念
  • Transform设置父物体,查找子物体+Input类
  • GraphRAG-Local-UI - 基于 GraphRAG 支持本地的聊天UI
  • SAP 投资 1200 万新元推动新加坡的人工智能创新
  • 回溯算法解决排列组合及子集问题
  • 滚雪球学MySQL[5.2讲]:并发事务的处理
  • 如何在Windows和Linux查看正在监听的端口和绑定的进程
  • JS 入门
  • LabVIEW提高开发效率技巧----使用动态事件
  • 57.对称二叉树
  • 利用SpringBoot框架开发星之语明星周边商城
  • 使用树莓派搭建音乐服务器
  • 【C#生态园】构建安全可靠的身份验证:六种C# OAuth认证库全面比较