1.主串与模式串的模式匹配
这里讲了两种方法,bp暴力匹配和kmp算法。
想要理解kmp算法,就一定要弄懂kmp的核心,最长前后缀数组的求法。这里直接上代码。
void prefix_table(string a,int prefix[],int n)
{
prefix[0]=0;
int len=0;
int i=1;//这里我选择从两个字符开始对比,应为从一开始是,自己和自己比一定相同。
while(i<n)
{
if(a[i]==a[len])
{
len++;
prefix[i]=len;
i++;
}
else if(len>0)
{
len=prefix[len-1];
}
else
{
prefix[i]=len;
i++;
}
}
for(int i=n-1;i>0;i--)//为了后续knp的实现方便,先将数组首位赋-1,其余后移。
{
prefix[i]=prefix[i-1];
}
prefix[0]=-1;
}
2.人工智能核心
我的去空格和老师的不同
char b[MAXSIZE];//这个算法
int j=0;
b[0]=a[0];
for(int i=0;i<a.length();i++)
{
if(b[j]!=a[i])
{
j++;
b[j]=a[i];
}
else if(b[j]==a[i]&&a[i]!=' ')
{
j++;
b[j]=a[i];
}
这里可以看到,和后一个算法比较,前一个算法 是通过主串和用于存放的字符数组比较,而非主串的前后比较,这样可以保持操作的一致性。
while(s[i]!='\0')
{
if(s[i]==' '&&s[i-1]==' ')
{
i++;
continue;
}