c语言 滑窗法_算法4-1,4-3:定位子串 (C++代码) 两种方法:滑窗法和kmp法

方法一:滑窗法。时间是 O(n*m)#include 

#include 

#define Max_nums 100

using namespace std;

int findSubIndex(char *str1, char* str2){

for(int i=0; i<=strlen(str1)-strlen(str2); i++){

int j=0;

// 这里开个大小strlen(str2)的滑窗

while(j

if(j==strlen(str2)) return i+1;

}

return 0;

}

int main(){

char str1[Max_nums],str2[Max_nums];

while(cin>>str1>>str2){

cout<

}

return 0;

}

方法二:kmp算法。时间: O(m+n)#include 

#include 

#define Max_nums 100

using namespace std;

void getNext(char *str, int *next){

//生成next数组值

next[0] = -1;

int k=-1, j=0;

while(j 

if(k==-1 || str[k]==str[j])

next[

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: KMP算法一种字符串匹配算法,用于在一个文本串查找一个模式串的出现位置。它通过利用模式串的部分匹配信息,可以大大减少匹配的次数,提高匹配效率。 下面是一个使用C语言实现KMP算法的例子: ``` #include <stdio.h> #include <string.h> void getNext(char *pattern, int *next) { int len = strlen(pattern); next[0] = -1; int k = -1; int j = 0; while (j < len - 1) { if (k == -1 || pattern[k] == pattern[j]) { ++k; ++j; next[j] = k; } else { k = next[k]; } } } int KMP(char *text, char *pattern) { int len1 = strlen(text); int len2 = strlen(pattern); int *next = (int *)malloc(sizeof(int) * len2); getNext(pattern, next); int i = 0; int j = 0; while (i < len1 && j < len2) { if (j == -1 || text[i] == pattern[j]) { ++i; ++j; } else { j = next[j]; } } if (j == len2) { return i - len2; } else { return -1; } } int main() { char text[] = "ababababca"; char pattern[] = "abababca"; int index = KMP(text, pattern); printf("index: %d\n", index); return 0; } ``` 在这个例子,函数getNext用于预处理模式串的next数组,next数组表示当前位置之前的子串,有多少个字符和当前位置的子串匹配。这个信息可以用来跳过不必要的匹配,从而提高匹配 ### 回答2: KMP算法,即Knuth-Morris-Pratt算法,是一种字符串匹配算法,其主要目的是在一个主串找到一个模式串的出现位置。KMP算法通过对模式串的前缀和后缀进行匹配来跳过一些不必要的比较,从而提高匹配效率。 具体实现KMP算法的步骤如下: 1. 预处理,构建一个部分匹配表,用于记录模式串每个子串的最长前缀和后缀的长度。部分匹配表可以帮助我们确定在不匹配时模式串需要向右移动的距离。 2. 在主串进行匹配,通过比较主串和模式串的字符来进行匹配。如果匹配成功,模式串继续向右移动,同时匹配成功的数量加1;如果匹配失败,则利用部分匹配表计算模式串需要向右移动的距离,并进行移动。 以下是用C语言实现KMP算法的示例代码: ``` #include<stdio.h> #include<string.h> // 构建部分匹配表 void buildPartialMatchTable(const char *pattern, int *table) { int len = strlen(pattern); int i = 0, j = -1; table[0] = -1; while (i < len) { if (j == -1 || pattern[i] == pattern[j]) { i++; j++; table[i] = j; } else { j = table[j]; } } } // KMP匹配 int kmp(const char *text, const char *pattern) { int textLen = strlen(text); int patternLen = strlen(pattern); int i = 0, j = 0; int *table = new int[patternLen]; buildPartialMatchTable(pattern, table); while (i < textLen) { if (j == -1 || text[i] == pattern[j]) { i++; j++; } else { j = table[j]; } if (j == patternLen) { delete[] table; return i - j; } } delete[] table; return -1; } int main() { const char *text = "AABACAABABACAA"; const char *pattern = "ABAB"; int index = kmp(text, pattern); if (index != -1) { printf("Pattern found at index %d\n", index); } else { printf("Pattern not found\n"); } return 0; } ``` 以上是KMP算法的简单介绍和用C语言实现的示例代码。通过构建部分匹配表和利用该表进行匹配,KMP算法可以在一个主串高效地查找模式串的出现位置。 ### 回答3: KMP算法(Knuth-Morris-Pratt算法)是一种字符串匹配算法,用于在一个主字符串查找一个给定的模式字符串。与朴素的字符串匹配算法相比,KMP算法具有更高的效率。 该算法的核心思想是利用已匹配的部分信息来避免不必要的比较。首先,通过预处理模式字符串,生成一个部分匹配表(partial match table),记录了模式字符串前缀与后缀的最长公共部分长度。然后,在匹配过程,通过对模式字符串和主字符串进行逐个字符的比较,当出现不匹配的情况时,根据部分匹配表的信息,调整模式字符串的对齐位置,从而实现跳跃式的匹配。 以下是利用C语言来实现KMP算法的示例代码: ```c #include <stdio.h> #include <string.h> void partialMatchTable(char* pattern, int* table) { int len = strlen(pattern); table[0] = 0; int i = 1; int j = 0; while (i < len) { if (pattern[i] == pattern[j]) { j++; table[i] = j; i++; } else { if (j != 0) { j = table[j-1]; } else { table[i] = 0; i++; } } } } void KMP(char* str, char* pattern) { int lenStr = strlen(str); int lenPattern = strlen(pattern); int* table = (int*)malloc(lenPattern * sizeof(int)); partialMatchTable(pattern, table); int i = 0; int j = 0; while (i < lenStr) { if (str[i] == pattern[j]) { i++; j++; } if (j == lenPattern) { // 匹配成功 printf("Pattern found at index: %d\n", i - j); j = table[j-1]; } else if (i < lenStr && str[i] != pattern[j]) { // 不匹配 if (j != 0) { j = table[j-1]; } else { i++; } } } free(table); } int main() { char str[] = "ABCABCDABABCDABCDABDE"; char pattern[] = "ABCDABD"; KMP(str, pattern); return 0; } ``` 此代码实现了KMP算法,首先通过`partialMatchTable`函数构建了部分匹配表,然后在`KMP`函数进行字符串匹配,输出匹配成功的索引位置。在主函数,我们使用了一个示例字符串和模式字符串进行测试,输出的结果是模式字符串在主字符串的匹配位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值