1、早上
通过看B站博主和大话数据结构学习本周新知识kmp和hash,大概懂了这两个知识点的含义,之后开始试着做本周的题目,但没有做出来。(3h)
2、下午
又重新看了一下B站讲解这两个知识的视频,并看了相关题目的讲解,之后又开始做本周题目,还是做出来了两个。(4h)
#include <stdio.h>
int coni(char a[100],char b[100])
{int num,i,j;
for(j=0;b[j];j++)//遍历第二个数组
{i=0,num=0;
if(a[i]==b[j])
{while(a[i]==b[j]&&a[i]&&b[j])
{num++;
i++;
j++;
}
if(b[j]==0)//从左往右,找到第一个能完全重合的部分,直接返回 ,因为从左到右所以重合部分最长
return num;
}
}
return 0;//整个序列遍历完都没返回,则无重合部分,返回0
}
main()
{char s1[100],s2[100];
int len1,len2;
scanf("%s",s1);
scanf("%s",s2);
len1=coni(s1,s2);//第一串的头,第二串的尾
len2=coni(s2,s1);//第二串的头,第一串的尾
printf("%d",len1>len2?len1:len2);
}
#include <stdio.h>
#include <string.h>
#define N 1000010
char s1[N],s2[N];
int num[N],prenum[N],temp[N],k=0;//三个数组分别是:存完全匹配开始下标,存s2数组前缀表,存s2后移一位的前缀表以便KMP查找
void getprenum()//获得前缀表
{int len=0,i=1;
prenum[0]=0;
while(i<strlen(s2))
{if(s2[i]==s2[len])
{len++;
prenum[i]=len;
i++;
}
else
{if(len>0)
len=prenum[len-1];
else
{prenum[i]=len;
i++;
}
}
}
}
void move()//后移前缀表
{temp[0]=-1;
for(int i=1;i<strlen(s2);i++)
temp[i]=prenum[i-1];
}
void kmp_search()
{int i=0,j=0;
while(i<strlen(s1))
{if(j==strlen(s2)-1&&s1[i]==s2[j])//找到一组完全匹配
{num[k++]=i-j+1;
j=temp[j];
}
if(s1[i]==s2[j])//相等则直接后移
{i++;j++;}
else//不相等
{j=temp[j];
if(j==-1)
{i++;j++;}
}
}
}
main()
{scanf("%s",s1);
scanf("%s",s2);
getprenum();
move();
kmp_search();
for(int i=0;i<k;i++)
printf("%d\n",num[i]);
for(int i=0;i<strlen(s2);i++)
printf("%d ",prenum[i]);
}
3、晚上
继续做本周的题目,做了一个好了几遍还是只对40,之后就开始写题解和今日总结。(1.5h)
今日总共学习时长8.5h。