再继续字符串匹配的过程中,为什么只对 j 进行操作是可行的?
查看原帖
再继续字符串匹配的过程中,为什么只对 j 进行操作是可行的?
800543
NirvanaCeleste楼主2024/5/10 19:17

再继续字符串匹配的过程中,为什么

j = len_next[j - 1];

是可行的?


完整代码如下:

( i,j的定义均 " 向后移 " 了一位 )

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000005;
int len_next[MAXN];
int lena,lenb,i,j,ans_tot;
string s1,s2;
void pre(){
	len_next[0] = 0;
	int len_n = 0;
	i = 1;
	while(i < lenb){
		if(s2[i] == s2[len_n]){
			len_n++;
			len_next[i] = len_n;
			i++;
		}else{
			if(len_n == 0){//
				len_next[i] = 0;
				i++;
			}else{
				len_n = len_next[len_n - 1];
				//len_n = len_next[len_next[i - 1] - 1]; 会超时 
				//len_n = len_next[next[i - 1]]; 错误写法 
			}
		} 
	}
	return;
}
void slove(){
	i = 0,j = 0;
	while(i < lena){
		if(s1[i] == s2[j]){
			i++;
			j++;
		}else if(j > 0){
			j = len_next[j - 1];
		}else{
			i++;
		}
		if(j == lenb){//
			printf("%d\n",i - j + 1);//
//			i = i - lenb + 1;//i = i - lenb + 2;
//			j = 0;//错误?严重超时 
			j = len_next[j - 1];//????????? 为什么这个是正确的 ?????????? 
		}
	}
	return;
}
int main(){
	cin>>s1>>s2;
	lena = s1.length();
	lenb = s2.length();
	pre();
	slove();
	for(int c=0;c<lenb - 1;c++) printf("%d ",len_next[c]);
	printf("%d",len_next[lenb - 1]);
	return 0;
}
2024/5/10 19:17
加载中...