0
点赞
收藏
分享

微信扫一扫

2022年2月8日学习总结

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。

举报

相关推荐

0 条评论