831. KMP字符串
字符串 KMP
2023-09-14 09:15:03 时间
KMP思路:
求next数组,匹配字符串
- next数组是求出每个p的下标能与前缀匹配的最长距离,求出那个点的坐标。求法就是和自己做匹配。
- 匹配过程就是当遇到不匹配不相等时,p字符串最少后退多少才能继续匹配,这个最少后退的长度就是我们next所求出的下标。
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,M=1e6+10;
int n,m;
char p[N],s[M];
int ne[N];
int main(){
cin>>n>>p+1>>m>>s+1;
//求next数组,也就是p和自己匹配
for(int i=2,j=0;i<=n;i++){
//j不为0并且匹配失败,p向右移动最少距离
while(j&&p[j+1]!=p[i]) j=ne[j];
//匹配成功,往下一个匹配
if(p[j+1]==p[i]) j++;
//当前位置i所能匹配的最长的下标为j
ne[i]=j;
}
//p和s匹配
for(int i=1,j=0;i<=m;i++){
while(j&&p[j+1]!=s[i]) j=ne[j];
if(p[j+1]==s[i]) j++;
//如果p全部匹配成功
if(j==n){
printf("%d ",i-n);
j=ne[j];//p向右移动最少距离
}
}
cout<<endl;
return 0;
}
相关文章
- 判断字符串是否正序倒序一致(判断回文字符串代码)
- 【说站】python使用f.read()返回字符串
- 5 种在 JavaScript 中获取字符串第一个字符的方法
- Java中把字符串数组转换成整型数组详解编程语言
- Java 字符串格式化详解编程语言
- Linux中将整形转换为字符串的方法(linux整形转字符串)
- 串抓住机会:从Oracle中转换字符串(oracle转换为字符)
- 如何使用Oracle的UPPER函数将字符串转换为大写字母?(oracle的upper)
- MySQL字符串替换功能简介(mysql 字符串替换)
- C语言连接Oracle数据库字符串操作技巧(c连接oracle字符串)
- Oracle中字符串与时间类型之间的转换(oracle中时间强转)
- Java中判断字符串是中文或者英文的工具类分享