KMP例题

KMP算法:实现两个字符串的匹配。
KMP讲解

//KMP模板
#include<bits/stdc++.h>
using namespace std;

void get_next(string t, int* next){
   
	int i=0;
	int j=-1;
	next[0]=-1;
	while(i<t.length()){
   
		if(j==-1||t[i]==t[j]){
   
			i++,j++;
			next[i]=j;
		}
		else{
   
			j=next[j];
		}
	}
}

int kmp(string s, string t){
   
	int next[t.length()+5];
	get_next(t, next);
	int i=0;
	int j=0;
	while(i<s.length()&&j<t.length()){
   
		if(j==0||s[i]==t[j]){
   
			i++,j++;
		}
		else{
   
			j=next[j];
		}
	}
	
	if(i==s.length()){
   
		return -1;
	} 
	if(j==t.length()){
   
		return i-t.length()+1;
	}
}

int main(){
   
	string a, b;
	a="abcde";
	b="cd";
	cout<<kmp(a, b);
	
	return 0;
} 

推荐学习KMP链接

例一:子串

牛客题目链接
给出一个正整数n,我们把1…n在k进制下的表示连起来记为s(n,k),例如s(16,16)=123456789ABCDEF10, s(5,2)=11011100101。现在对于给定的n和字符串t,我们想知道是否存在一个k(2 ≤ k ≤ 16),使得t是s(n,k)的子串。
输入描述:
第一行一个整数n(1 ≤ n ≤ 50,000)。
第二行一个字符串t(长度 ≤ 1,000,000)
输出描述:
“yes"表示存在满足条件的k,否则输出"no”
示例1
输入
8
01112
输出
yes


这道题直接套KMP模板就行,没有太多拐弯抹角的东西。

#include<bits/stdc++.h>
using namespace std
在C++中,KMP算法(Knuth-Morris-Pratt 算法)通常用于字符串匹配问题,包括计算某个模式串在主串中的位置。针对4.3节的例题"abbabcac",我们首先要创建一个next数组存储前缀函数的结果,然后遍历主串查找模式串。以下是一个简单的C++代码实现: ```cpp #include <iostream> #include <vector> // 计算next数组 std::vector<int> get_next(const std::string& pattern) { int len = pattern.length(); std::vector<int> next(len); int j = -1; for (int i = 0; i < len; ++i) { while (j != -1 && pattern[i] != pattern[j + 1]) { j = next[j]; } if (pattern[i] == pattern[j + 1]) { j++; } next[i] = j; } return next; } // KMP匹配主串 int kmp_search(const std::string& main_str, const std::string& pattern) { int len_main = main_str.length(), len_pattern = pattern.length(); std::vector<int> next = get_next(pattern); int index = 0, j = 0; while (index < len_main) { if (main_str[index] == pattern[j]) { index++, j++; } else if (j != 0) { j = next[j - 1]; // 如果当前字符不匹配,回溯到next[j - 1] } else { index++; // 主串继续匹配下一个字符 } if (j == len_pattern) { // 找到了匹配的模式 return index - j; } } return -1; // 没有找到匹配 } int main() { std::string main_str = "abbabcac"; std::string pattern = "abc"; int result = kmp_search(main_str, pattern); if (result != -1) { std::cout << "Pattern found at position " << result << std::endl; } else { std::cout << "Pattern not found" << std::endl; } return 0; } ``` 在这个例子中,`kmp_search` 函数首先计算了 `pattern` 的前缀函数 `next`,然后遍历 `main_str` 通过比较和回溯操作寻找 `pattern`。如果找到匹配,返回开始位置;否则返回 -1 表示未找到。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值