本章学习了两种算法,BF算法和KMP算法
BF算法就是暴力匹配,非常好理解
KMP算法的优点是,与BF算法相比,消除了回溯,大大提高了效率
缺点是,好难理解。。。
本章除了新学习了两种算法,我还看到了上学期所学的线性代数知识矩阵在编程上的应用(以前我总是不理解我一个计算机专业的学线性代数有什么用)
以及稀疏矩阵的十字链表表示
这周印象最深的就是实践题AI代码啦
要是没有老师带着我做,我都不知道何从下手。。。
实践题AI核心代码
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
bool isSeparator(char ch)
{//判断ch是否分隔符
//ch可能是:数字、字母、标点、空格、\0
//分隔符:!(数字、小写字母、I)
ch = tolower(ch);
if(ch>=‘0‘ && ch<=‘9‘ || ch>=‘a‘ && ch<=‘z‘ || ch==‘I‘)
return false;
else
return true;
}
bool ispunctuation(char dh)
{ //判断后一个是否为标点符号
dh=tolower(dh);
if(dh>=‘0‘&&dh<=‘9‘ || dh>=‘a‘&&dh<=‘z‘ || dh==‘I‘ || dh==‘ ‘)
return false;
else
return true;
}
bool iscanyou(char t[],int j)
{
if(t[j]==‘c‘&&t[j+1]==‘a‘&&t[j+2]==‘n‘&&t[j+3]==‘ ‘&&t[j+4]==‘y‘&&t[j+5]==‘o‘&&t[j+6]==‘u‘)
{
if((j==0||isSeparator(t[j-1]) )&&isSeparator(t[j+7]))
return true;
}
else
return false;
}
void go(string s)
{
char t[3001];//注意输入全部是I的时候,输出长度是输入的三倍
//string t;
int i, j;//i,j分别为s,t的下标
//i定位到s的第一个非空字符
for(i=0; s[i]!=‘\0‘&&s[i]==‘ ‘; ++i);//循环体为空
j = 0; //j的初值为0
//从s的第一个非空字符开始,逐个扫描,分情况复制到t
while(s[i]!=‘\0‘){
if(s[i]==‘ ‘ && s[i-1]==‘ ‘){
++i; //如果漏了这句,有连续空格时会死循环
continue;
}
if(s[i]==‘?‘){
t[j++] = ‘!‘;
++i;
continue;
}
if(s[i]!=‘I‘){
t[j] = tolower(s[i]);
++i;++j;
continue;
}
t[j++] = s[i++];
}
t[j] = ‘\0‘;
j = 0;
while(t[j]!=‘\0‘){
if(t[j]==‘I‘ && (j==0 || isSeparator(t[j-1])) && isSeparator(t[j+1])){
cout << "you";
++j;
continue;
}
if(t[j]==‘m‘ && t[j+1]==‘e‘ && (j==0 || isSeparator(t[j-1])) && isSeparator(t[j+2])){
cout << "you";
j += 2;
continue;
}
if(t[j]==‘ ‘&& ispunctuation(t[j+1]))
{
++j;
continue;
}
if(iscanyou(t,j))
{
cout<<"I can";
j+=7;
continue;
}
if(s[j]==‘ ‘&&s[j+1]==‘\0‘)
{
++j;
continue;
}
cout<<t[j++];
}
cout<<endl;
}
int main()
{
string s;
int n, i;
cin >> n;
getchar(); //吸收回车符
for(i=1; i<=n; i++){
getline(cin, s);
cout << s << endl;
cout << "AI: ";
go(s);//AI根据s输出对话
}
return 0;
}