字符串匹配c语言版

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include
#include
#include
#include
#include
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSTRLEN 256
typedef int Status;
typedef struct{
char *ch;
int length;
}HString;


int Max(int a,int b){
if(a>b)
return a;
else
return b;
}

int Min(int a,int b){
if(a>b)
return b;
else
return a;
}

int LevenshteinDistance(HString s1,HString s2)//编辑距离
{
int i,j,cost,deletion,insertion,substitution;
char n,m;
int c[MAXSTRLEN][MAXSTRLEN];//存放每次计算的二维数组
if(s1.ch==s2.ch)
return 0;
if(s1.length==0)
return s2.length;
if(s2.length==0)
return s1.length;
for(i=0;i<=s1.length+1;i++)
c[i][0]=i;
for(j=0;j<=s2.length+1;j++)
c[0][j]=j;
for(i=1;i<=s1.length;i++)
{
n=s1.ch[i-1];
for(j=1;j<=s2.length;j++)
{
m=s2.ch[j-1];
cost=m==n?0:1;
deletion=c[i][j-1]+1;//s2中j-1个字符对比后加1
insertion=c[i-1][j]+1;//s1中i-1个字符对比后加1
substitution=c[i-1][j-1]+cost;
c[i][j]=Min(Min(deletion,insertion),substitution);//取最小值
/*cout<if(j==s2.length)
cout<}
}
return c[i-1][j-1];
}

Status LCS(HString s1, HString s2, HString sub)
{
int index=0,length=0,i,j,n,k;
int d[MAXSTRLEN][MAXSTRLEN];
if (s1.ch==s2.ch)
{
for(i=0;i<=s1.ch[0];i++)
sub.ch[i]=s1.ch[i];
return OK;
}
else
if (s1.ch==""||s2.ch=="")
{
sub.ch[0]='\0';
sub.length=0;
return OK;
}
for (i=0;i<=s1.length;i++)
{
for (j=0;j<=s2.length;j++)
{
n=i-1>=0&&j-1>=0?d[i-1][j-1]:0;// 左上角值
d[i][j]= s1.ch[i]==s2.ch[j]?n+1:0;// 当前节点值 = "1 + 左上角值" : "0"
if(d[i][j]>length)
{ // 如果是最大值,则记录该值和行号
length=d[i][j];
index=i;
}
cout<if(j==s2.length)
cout<}
}
for(i=0,k=index-length;isub.ch[i]='\0';
sub.length=length;
return OK;

}



int main()
{
HString s1,s2,sub;
int choose=1,i;
float v,L;
s2.ch=new char[];
s1.ch=new char[];
//s2.ch=new char[];
sub.ch=new char[];
while(choose!=0)
{

cout<<"请输入字符串S1"<gets(s1.ch);
for(i=0;s1.ch[i]!='\0';i++)
{
}
s1.length=i;
cout<<"请输入字符串S2"<gets(s2.ch);
for(i=0;s2.ch[i]!='\0';i++)
{
}
s2.length=i;
cout<<"编辑距离为:"<L=LevenshteinDistance(s1,s2);
cout<LCS(s1,s2,sub);
cout<<"最大公共子串sub为:"<v=1-2*L/(s1.length+s2.length);
cout<<"相似度为"<cout<<"输入0退出;输入1继续"<cout<<"请输入:";
cin>>choose;
fflush(stdin);
}return 1;
cout<delete[]s1.ch;
delete[]s2.ch;
dele

te[]sub.ch;
}




相关文档
最新文档