1.KMP算法
next数组从0开始
代码如下:
#include<cstdio>
#include<cstring>
#include<vector>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
void getnext(string s,vector<int> &next)
{
next.clear();
next.resize(s.size());
int i=1,j=0;
next[0]=0;
for(i=1;i<next.size();i++)
{
while(s[i]!=s[j]&&j>0)
{
j=next[j-1];
}
if(s[i]==s[j])
{
j++;
}
next[i]=j;
}
}
int KMP(string p,string c,vector<int> next)
{
int i,j=0;
for(i=0;i<p.length();i++)
{
while(j>0&&p[i]!=c[j])//先判断不等,再判断相等
{
j=next[j-1];//j向前回溯,看next值回溯
}
if(p[i]==c[j])
{
j++;
}
}
if(j==c.length())
return i-c.length()+1 ;
else return -1;
}
int main()
{
string c;
string p;
cin>>p;
cin>>c;
vector<int> next(10,0);
getnext(c,next);
for(int i=0;i<next.size();i++)
{
cout<<next[i]<<" ";
}
int y=KMP(p,c,next);
cout<<y;
return 0;
}
以上代码参照该视频编写
**
- 2.邻接矩阵的DFS和BFS
**
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
typedef struct
{
int **a;
int n;
int e;
} Graph;
int visit[20]={0};
void DFS(Graph*G,int n)
{
cout<<n;
visit[n]=1;
for(int i=0;i<G->n;i++)
{
if(visit[i]!=1&&i!=n&&G->a[n][i]==1)
{
DFS(G,i);
}
}
}
queue<int> q;
void BFS(Graph*G,int n)
{
int t;
cout<<"0";
visit[0]=1;
q.push(0);
while(!q.empty())
{
t=q.front();
q.pop();
for(int i=0;i<G->n;i++)
{
if(G->a[t][i]!=0&&visit[i]!=1&&t!=i)
{
cout<<i;
visit[i]=1;
q.push(i);
}
}
}
}
int main()
{
int x,y;
int i;
Graph*G;
G=new Graph;
G->a=new int*[20];//使用该结构体前必须进行初始化,否则会出现运行错误
for(i=0;i<20;i++)
{
G->a[i]=new int[20];
}
cout<<"顶点"<<endl;
cin>>G->n;
cout<<"边"<<endl;
cin>>G->e;
for(i=0;i<G->n;i++)
for(int j=0;j<G->n;j++)
{
G->a[i][j]=0;
}
for(i=0;i<G->e;i++)
{
cin>>x>>y;
G->a[x][y]=1;
G->a[y][x]=1;
}
for(i=0;i<G->n;i++)
{
for(int j=0;j<G->n;j++)
{
cout<<G->a[i][j];
}
cout<<endl;
}
//DFS(G,G->n-1);
cout<<endl;
BFS(G,G->n-1);
return 0;
}