用c++写一个KMP算法

时间: 2023-08-31 22:28:24 浏览: 44
### 回答1: KMP算法是一种字符串匹配算法,可以快速在文本串中找到模式串的出现位置。 下面是一个用C语言实现的KMP算法的示例代码: ```c #include <stdio.h> #include <string.h> // 计算 next 数组 void get_next(char *p, int *next) { int p_len = strlen(p); next[0] = -1; int k = -1; int j = 0; while (j < p_len - 1) { // p[k] 表示前缀,p[j] 表示后缀 if (k == -1 || p[k] == p[j]) { ++k; ++j; next[j] = k; } else { k = next[k]; } } } // KMP 匹配字符串 int kmp_match(char *s, char *p) { int s_len = strlen(s); int p_len = strlen(p); int *next = (int*)malloc(sizeof(int) * p_len); get_next(p, next); int i = 0; int j = 0; while (i < s_len && j < p_len) { // ①如果 j = -1,或者当前字符匹配成功(即 S[i] == P[j]),都令 i++,j++ if (j == -1 || s[i] == p[j]) { i++; j++; } else { // ②如果 j != -1,且当前字符匹配失败(即 S[i] != P[j]),则令 i 不变,j = next[j] // next[j] 即为 j 所对应的 next 值 j = next[j]; } } free(next); if (j == p_len) { // 匹配成功 return i - j; } else { // 匹配失败 return -1; } } int main() { char *s = "BBC ABCDAB ABCDABCDABDE"; char *p = "ABCDABD"; int result = kmp_match( ### 回答2: KMP算法(Knuth-Morris-Pratt算法)是一种用于字符串匹配的高效算法。其核心思想是利用已经匹配过的部分信息,避免对已经比较过的元素进行重复比较,从而提高匹配的效率。 以下是用C语言实现KMP算法的示例代码: ```c #include <stdio.h> #include <string.h> void computeLPSArray(char* pattern, int* lps) { int m = strlen(pattern); int len = 0; lps[0] = 0; int i = 1; while (i < m) { if (pattern[i] == pattern[len]) { len++; lps[i] = len; i++; } else { if (len != 0) { len = lps[len - 1]; } else { lps[i] = 0; i++; } } } } void KMPSearch(char* pattern, char* text) { int m = strlen(pattern); int n = strlen(text); int lps[m]; computeLPSArray(pattern, lps); int i = 0; int j = 0; while (i < n) { if (pattern[j] == text[i]) { j++; i++; } if (j == m) { printf("Pattern found at index %d\n", i - j); j = lps[j - 1]; } else if (i < n && pattern[j] != text[i]) { if (j != 0) { j = lps[j - 1]; } else { i = i + 1; } } } } int main() { char text[] = "ABABDABACDABABCABAB"; char pattern[] = "ABABCABAB"; KMPSearch(pattern, text); return 0; } ``` 这段代码中,`KMPSearch`函数用来实现KMP算法的主要逻辑,其中`computeLPSArray`函数用于计算pattern字符串的最长公共前后缀长度。 以上就是使用C语言编写KMP算法的示例代码,通过KMP算法可以高效地在一个文本字符串中搜索多个模式字符串。 ### 回答3: KMP算法是一种字符串匹配算法,用于在一个较长的字符串中查找一个较短的字符串是否存在。下面是使用C语言编写的KMP算法的示例代码: ```c #include<stdio.h> #include<string.h> // 计算next数组 void computeNextArray(char* pattern, int* next) { int patternLen = strlen(pattern); next[0] = -1; int i = 0, j = -1; while (i < patternLen) { if (j == -1 || pattern[i] == pattern[j]) { i++; j++; next[i] = j; } else { j = next[j]; } } } // KMP算法 int KMPSearch(char* text, char* pattern) { int textLen = strlen(text); int patternLen = strlen(pattern); int* next = (int*)malloc((patternLen + 1) * sizeof(int)); computeNextArray(pattern, next); int i = 0, j = 0; while (i < textLen) { if (j == -1 || text[i] == pattern[j]) { i++; j++; } else { j = next[j]; } if (j == patternLen) { free(next); return i - j; // 返回匹配到的字符串在文本中的起始位置 } } free(next); return -1; // 没有找到匹配的字符串 } int main() { char text[100], pattern[100]; printf("请输入文本字符串:"); scanf("%s", text); printf("请输入要查找的字符串:"); scanf("%s", pattern); int position = KMPSearch(text, pattern); if (position == -1) { printf("在文本字符串中未找到匹配的字符串。\n"); } else { printf("在文本字符串中找到了匹配的字符串,起始位置:%d\n", position); } return 0; } ``` 以上是一个简单的KMP算法的实现,通过在算法中利用next数组来避免不必要的模式串回溯。算法首先计算出模式串的next数组,然后在文本串中进行匹配。最终输出匹配的起始位置或者未找到匹配的提示信息。

相关推荐

### 回答1: 好的,以下是KMP算法的C语言实现: c #include <stdio.h> #include <string.h> void compute_lps(char* pat, int M, int* lps) { int len = 0; lps[0] = 0; int i = 1; while (i < M) { if (pat[i] == pat[len]) { len++; lps[i] = len; i++; } else { if (len != 0) { len = lps[len - 1]; } else { lps[i] = 0; i++; } } } } void kmp_search(char* pat, char* txt) { int M = strlen(pat); int N = strlen(txt); int lps[M]; compute_lps(pat, M, lps); int i = 0; int j = 0; while (i < N) { if (pat[j] == txt[i]) { j++; i++; } if (j == M) { printf("Pattern found at index %d\n", i - j); j = lps[j - 1]; } else if (i < N && pat[j] != txt[i]) { if (j != 0) { j = lps[j - 1]; } else { i = i + 1; } } } } int main() { char txt[] = "ABABDABACDABABCABAB"; char pat[] = "ABABCABAB"; kmp_search(pat, txt); return 0; } 以上就是使用C语言实现KMP算法的代码,它可以在给定的文本中查找一个模式串的出现位置。 ### 回答2: KMP算法是一种高效的字符串匹配算法,用于解决字符串匹配的问题。下面是用C语言编写KMP算法的代码示例: c #include <stdio.h> #include <string.h> void computeLPSArray(char* pattern, int M, int* lps) { int len = 0; int i = 1; lps[0] = 0; while (i < M) { if (pattern[i] == pattern[len]) { len++; lps[i] = len; i++; } else { if (len != 0) { len = lps[len - 1]; } else { lps[i] = 0; i++; } } } } void KMP(char* pattern, char* text) { int M = strlen(pattern); int N = strlen(text); int* lps = (int*)malloc(sizeof(int) * M); int j = 0; computeLPSArray(pattern, M, lps); int i = 0; while (i < N) { if (pattern[j] == text[i]) { j++; i++; } if (j == M) { printf("Pattern found at index %d\n", i - j); j = lps[j - 1]; } else if (i < N && pattern[j] != text[i]) { if (j != 0) { j = lps[j - 1]; } else { i++; } } } free(lps); } int main() { char text[] = "ABABDABACDABABCABAB"; char pattern[] = "ABABCABAB"; KMP(pattern, text); return 0; } 以上是一个基于C语言的KMP算法示例。该代码中的computeLPSArray函数用于计算匹配模式的最长公共前缀和后缀(Longest Prefix that is also Suffix),KMP函数则是实现了KMP算法的主体逻辑。在main函数中,我们可以通过调用KMP函数进行字符串匹配,输出匹配成功的子串在原始字符串中的位置。 ### 回答3: KMP算法是一种字符串匹配算法,用于在一个(主)字符串中查找一个(模式)字符串的出现位置。下面是使用C代码实现KMP算法的示例: c #include <stdio.h> #include <string.h> void buildLPSArray(char* pattern, int patternLen, int* lps) { int len = 0; lps[0] = 0; int i = 1; while (i < patternLen) { if (pattern[i] == pattern[len]) { len++; lps[i] = len; i++; } else { if (len != 0) { len = lps[len - 1]; } else { lps[i] = 0; i++; } } } } void KMP(char* text, char* pattern) { int textLen = strlen(text); int patternLen = strlen(pattern); int lps[patternLen]; buildLPSArray(pattern, patternLen, lps); int i = 0; // 文本字符串中的当前位置 int j = 0; // 模式字符串中的当前位置 while (i < textLen) { if (pattern[j] == text[i]) { i++; j++; } if (j == patternLen) { printf("模式出现的位置: %d\n", i - j); j = lps[j - 1]; } else if (i < textLen && pattern[j] != text[i]) { if (j != 0) j = lps[j - 1]; else i++; } } } int main() { char text[] = "ABABDABACDABABCABAB"; char pattern[] = "ABABCABAB"; KMP(text, pattern); return 0; } 这段代码实现了一个简单的KMP算法,用来在text字符串中查找pattern字符串的出现位置。它使用了两个函数:buildLPSArray用于构建pattern字符串的最长公共前缀和后缀数组,KMP函数则用于实际的匹配操作。在main函数中,我们可以自定义text和pattern字符串来进行测试。运行程序后,将会输出模式出现的位置:模式出现的位置: 10。
### 回答1: KMP算法是一种在文本串中查找模式串的字符串匹配算法。C语言实现KMP算法的方法如下: 1. 预处理next数组:next数组记录模式串中的前缀和后缀的最长公共匹配长度,以便在文本串匹配失败时快速定位下一个匹配位置。 2. 初始化两个指针i和j,分别指向文本串和模式串的开头。 3. 如果文本串和模式串中的字符相匹配,则i和j同时向后移动。 4. 如果文本串和模式串中的字符不匹配,则j回退到next[j]的位置,i保持不变。 5. 当j移动到模式串的末尾时,表示匹配成功,返回i的位置;否则,当i移动到文本串的末尾时,表示匹配失败,返回-1。 以下是一份示例代码: #include <stdio.h> #include <string.h> void get_next(const char *p, int next[]) { int p_len = strlen(p); int j = 0; int k = -1; next[0] = -1; while (j < p_len - 1) { if (k == -1 || p[j] == p[k]) { ++j; ++k; next[j] = k; } else { k = next[k]; } } } int kmp_search(const char *s, const char *p) { int s_len = strlen(s); int p_len = strlen(p); int i = 0; int j = 0; int next[ ### 回答2: KMP算法是一种用于字符串匹配的算法,通过预处理模式串,可以在匹配过程中尽量减少比较次数,从而提高匹配效率。 实现KMP算法的关键是构建一个next数组,该数组记录了模式串中每个位置匹配失败时应该回溯到哪个位置进行下一次匹配。 具体的C语言实现如下: #include <stdio.h> #include <string.h> void getNext(char* pattern, int* next) { int m = strlen(pattern); int i = 0, j = -1; next[0] = -1; while (i < m) { if (j == -1 || pattern[i] == pattern[j]) { i++; j++; next[i] = j; } else { j = next[j]; } } } int KMP(char* text, char* pattern) { int n = strlen(text); int m = strlen(pattern); int i = 0, j = 0; int* next = new int[m]; getNext(pattern, next); while (i < n && j < m) { if (j == -1 || text[i] == pattern[j]) { i++; j++; } else { j = next[j]; } } delete[] next; if (j == m) { return i - j; } return -1; } int main() { char text[] = "ABABABABCABABABA"; char pattern[] = "ABABA"; int pos = KMP(text, pattern); if (pos != -1) { printf("匹配成功,模式串首次出现的位置为:%d\n", pos); } else { printf("匹配失败\n"); } return 0; } 以上代码实现了KMP算法,首先通过getNext函数得到模式串的next数组,然后在主函数中使用KMP函数进行匹配。在匹配成功时,返回模式串首次出现的位置,否则返回-1。测试结果为 "匹配成功,模式串首次出现的位置为:2",即模式串"ABABA"在文本串"ABABABABCABABABA"中首次出现的位置是2。 ### 回答3: KMP算法是一种高效的字符串匹配算法,用于在一个主串中匹配一个模式串。下面是用C语言实现KMP算法的示例代码: c #include <stdio.h> #include <string.h> void getNext(char *pattern, int *next) { int i = 0, j = -1; next[0] = -1; while (pattern[i] != '\0') { if (j == -1 || pattern[i] == pattern[j]) { i++; j++; next[i] = j; } else { j = next[j]; } } } int kmp(char *text, char *pattern) { int lenText = strlen(text); int lenPattern = strlen(pattern); int *next = new int[lenPattern]; getNext(pattern, next); int i = 0, j = 0; while (i < lenText && j < lenPattern) { if (j == -1 || text[i] == pattern[j]) { i++; j++; } else { j = next[j]; } } delete[] next; if (j == lenPattern) { return i - j; } else { return -1; } } int main() { char text[] = "ABCABCDABCDABCDABDE"; char pattern[] = "ABCDABD"; int result = kmp(text, pattern); if (result == -1) { printf("Pattern not found in the text.\n"); } else { printf("Pattern found at index %d.\n", result); } return 0; } 上述代码中,getNext函数用于计算模式串的最长前缀和最长后缀的公共部分,生成next数组。主函数中的kmp函数就是利用next数组进行匹配过程。若匹配成功,则返回模式串在主串中的起始位置,否则返回-1表示未找到。在示例代码中,主函数打印出找到的起始位置或者未找到的信息。
zip
【资源介绍】 课程大作业基于Node.js的四级单词背诵网站源码+项目说明.zip 易查单词是一个背诵单词的网站,内置四级单词库,可以高效的帮助备战四级的人群背诵单词。对每一个背过的单词都会进行记录,通过内置算法,有效复习背诵过的单词。同时,网站还支持单词添加功能,可以添加用户遇到的生僻单词,拥有用户自己的单词本。 ## 技术路线 Egg.js + MySQL + Axios.js + Node.js + jQuery ## 项目实现 项目利用Egg.js框架进行构建,使用npm工具管理项目相关的包。首先利用HTML、CSS、JS完成页面的基本布局和美化。然后创建项目所需的API,并配置路由,然后通过getman测试API的功能。前端通过Axios.js向后台数据库发送异步的请求,实现对数据库内容的增删改查,最后将后台响应的异步的信息进行处理后渲染在页面相应的位置。 ## 项目运行 要运行测试,运行以下命令 1. 安装项目的相关依赖包 bash npm i 2. 将项目中的数据表导入到MySQL数据库 进入MySQL可视化工具,选择运行SQL文件 3. 在配置文件中配置数据库参数 找到config文件夹下的config.default.js文件 //数据库mysql配置 exports.mysql = { client: { host: 'localhost', port: '3306', user: 'root',//管理员名字 password: '925336',//数据库密码,要根据情况修改 database: 'societies',//数据库名字,要根据情况修改 }, }; 4. 运行 bash npm run dev 5. 通过浏览器访问项目 http://localhost:7000/public/html/about.html 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,也适用于小白学习入门进阶。当然也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或者热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载,沟通交流,互相学习,共同进步!

最新推荐

C++ 数据结构之kmp算法中的求Next()函数的算法

主要介绍了C++ 数据结构之kmp算法中的求Next()函数的算法的相关资料,需要的朋友可以参考下

计网题库(更新ing)

悉院计网12.10

课程大作业基于Node.js的四级单词背诵网站源码+项目说明.zip

【资源介绍】 课程大作业基于Node.js的四级单词背诵网站源码+项目说明.zip 易查单词是一个背诵单词的网站,内置四级单词库,可以高效的帮助备战四级的人群背诵单词。对每一个背过的单词都会进行记录,通过内置算法,有效复习背诵过的单词。同时,网站还支持单词添加功能,可以添加用户遇到的生僻单词,拥有用户自己的单词本。 ## 技术路线 Egg.js + MySQL + Axios.js + Node.js + jQuery ## 项目实现 项目利用Egg.js框架进行构建,使用npm工具管理项目相关的包。首先利用HTML、CSS、JS完成页面的基本布局和美化。然后创建项目所需的API,并配置路由,然后通过getman测试API的功能。前端通过Axios.js向后台数据库发送异步的请求,实现对数据库内容的增删改查,最后将后台响应的异步的信息进行处理后渲染在页面相应的位置。 ## 项目运行 要运行测试,运行以下命令 1. 安装项目的相关依赖包 ```bash npm i ``` 2. 将项目中的数据表导入到MySQL数据库 进入MySQL可视化工具,选择运行SQL文件 3. 在配置文件中配置数据库参数 找到config文件夹下的config.default.js文件 ``` //数据库mysql配置 exports.mysql = { client: { host: 'localhost', port: '3306', user: 'root',//管理员名字 password: '925336',//数据库密码,要根据情况修改 database: 'societies',//数据库名字,要根据情况修改 }, }; ``` 4. 运行 ```bash npm run dev ``` 5. 通过浏览器访问项目 ``` http://localhost:7000/public/html/about.html ``` 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,也适用于小白学习入门进阶。当然也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或者热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载,沟通交流,互相学习,共同进步!

torch_cluster-1.5.9-cp37-cp37m-linux_x86_64.whl.zip

需要配和指定版本torch-1.10.0+cu102使用,请在安装该模块前提前安装torch-1.10.0+cu102以及对应cuda10.2和cudnn

K012576-3.0-Market and Sell Products and Services-7.3.1

PCF模型中对市场和销售模型的详细说明

哈希排序等相关算法知识

哈希排序等相关算法知识

混合神经编码调制的设计和训练方法

可在www.sciencedirect.com在线获取ScienceDirectICTExpress 8(2022)25www.elsevier.com/locate/icte混合神经编码调制:设计和训练方法Sung Hoon Lima,Jiyong Hana,Wonjong Noha,Yujae Songb,Sang-WoonJeonc,a大韩民国春川,翰林大学软件学院b韩国龟尾国立技术学院计算机软件工程系,邮编39177c大韩民国安山汉阳大学电子电气工程系接收日期:2021年9月30日;接收日期:2021年12月31日;接受日期:2022年1月30日2022年2月9日在线发布摘要提出了一种由内码和外码组成的混合编码调制方案。外码可以是任何标准的二进制具有有效软解码能力的线性码(例如,低密度奇偶校验(LDPC)码)。内部代码使用深度神经网络(DNN)设计,该深度神经网络获取信道编码比特并输出调制符号。为了训练DNN,我们建议使用损失函数,它是受广义互信息的启发。所得到的星座图被示出优于具有5G标准LDPC码的调制�

利用Pandas库进行数据分析与操作

# 1. 引言 ## 1.1 数据分析的重要性 数据分析在当今信息时代扮演着至关重要的角色。随着信息技术的快速发展和互联网的普及,数据量呈爆炸性增长,如何从海量的数据中提取有价值的信息并进行合理的分析,已成为企业和研究机构的一项重要任务。数据分析不仅可以帮助我们理解数据背后的趋势和规律,还可以为决策提供支持,推动业务发展。 ## 1.2 Pandas库简介 Pandas是Python编程语言中一个强大的数据分析工具库。它提供了高效的数据结构和数据分析功能,为数据处理和数据操作提供强大的支持。Pandas库是基于NumPy库开发的,可以与NumPy、Matplotlib等库结合使用,为数

帮我用C++和Qt写一个m*n的矩阵最小路径和可视化,要求用格子展示,最小路径采用其它的颜色标记

好的,以下是一个基本的实现: 1. 首先需要定义一个矩阵类来存储矩阵数据和计算最小路径和。 ```c++ class Matrix{ public: Matrix(int rows, int cols); ~Matrix(); void setValue(int i, int j, int value); //设置元素的值 int getValue(int i, int j); //获取元素的值 int getRows(); //获取行数 int getCols(); //获取列数 int getMinPathSum(); //获取最

基于android的视频播放器的设计与实现--大学毕业论文.doc

基于android的视频播放器的设计与实现--大学毕业论文.doc