📅  最后修改于: 2023-12-03 15:42:13.487000             🧑  作者: Mango
本次 Gate CS Mock 2018年套装2中的第38章主要涵盖了以下几个方面:
贪心算法是一种基于贪心选择性质的优化算法。贪心算法在每一步选择中都采取当前状态下最优的选择,从而希望导致全局最优解。
Gate CS Mock 2018年套装2中的第38章主要涉及了以下两个贪心算法:
后缀数组是一种数据结构,用于解决字符串的多种问题,如高效的模式匹配、重复问题等。Gate CS Mock 2018年套装2中的第38章主要涵盖了如何构建后缀数组、如何使用后缀数组进行模式匹配等。
以下是构建后缀数组的C++代码样例:
#include<bits/stdc++.h>
using namespace std;
#define TEXT_INPUT_STRING "banana"
int n,g,sa[7],ra[7],tra[7],lcp[7];
char t[7],m[256];
void buildsa()
{
int i,k;
n=strlen(t);
for(i=0;i<=256;i++)
{
ra[i]=0;
}
for(i=0;i<n;i++)
{
ra[i]=t[i];
sa[i]=i;
}
for(k=1;k<=n;k*=2)
{
sort(sa,sa+n,[&k](const int &a,const int &b)
{
return ra[a+k]<ra[b+k];
});
tra[sa[0]]=g=0;
for(i=1;i<n;i++)
{
tra[sa[i]]=(g+=ra[sa[i-1]+k]!=ra[sa[i]+k]);
}
for(i=0;i<n;i++)
{
ra[i]=tra[i];
}
if(ra[sa[n-1]]==n-1)
{
break;
}
}
}
int main()
{
int i,j,k;
strcpy(t,TEXT_INPUT_STRING);
buildsa();
for(i=1;i<n;i++)
{
cout<<"Suffix at index "<<i<<" has rank "<<ra[i]<<" and is ";
for(j=sa[ra[i]];j<n && i<n;j++)
{
cout<<t[j];
}
cout<<"\n";
}
return 0;
}
在以上代码中,buildsa()函数实现了后缀数组的构建过程。
Gate CS Mock 2018年套装2中的第38章还涉及了常见的字符串匹配算法,如KMP算法、Boyer-Moore算法等。
以下是使用KMP算法进行字符串匹配的C++代码样例:
#include<bits/stdc++.h>
using namespace std;
void computeLpsArray(char* pat,int M,int* lps);
void KMPSearch(char* pat,char* txt)
{
int M=strlen(pat);
int N=strlen(txt);
int lps[M];
computeLpsArray(pat,M,lps);
int i=0,j=0;
while(i<N)
{
if(pat[j]==txt[i])
{
j++;
i++;
}
if(j==M)
{
printf("Found pattern at index %d \n",i-j);
j=lps[j-1];
}
else if(i<N && pat[j]!=txt[i])
{
if(j!=0)
{
j=lps[j-1];
}
else
{
i++;
}
}
}
}
void computeLpsArray(char* pat,int M,int* lps)
{
int len=0;
lps[0]=0;
int i=1;
while(i<M)
{
if(pat[i]==pat[len])
{
len++;
lps[i]=len;
i++;
}
else
{
if(len!=0)
{
len=lps[len-1];
}
else
{
lps[i]=0;
i++;
}
}
}
}
int main()
{
char txt[]="ABABDABACDABABCABAB";
char pat[]="ABABCABAB";
KMPSearch(pat,txt);
return 0;
}
在以上代码中,computeLpsArray()函数实现了KMP算法中的辅助数组lps的计算,而KMPSearch()函数利用lps数组实现了字符串匹配的过程。
以上便是Gate CS Mock 2018年套装2中的第38章的简要介绍。