私は以下のように文字列比較のための関数コードを持っています:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int max=0;
int calcMis(char *string,int i, int j,int len)
{
int mis=0;
int k=0;
while(k<len)
{
if(string[i+k]!=string[j+k])
mis+=1;
if((mis+len-k-1)<=max)
return 1;
else if(mis>max)
return 0;
k=k+1;
}
}
int main()
{
char *input=malloc(2000*sizeof(char));
scanf("%d",&max);
scanf("%s",input);
int c=0,i,j,k,x,mis=0;
int len=strlen(input);
i=0;
while(i<len-1)
{
j=i;
while(j<len-1)
{
k=i+1;
x=j-i+1;
if(x<=max)
c=c+len-k-x+1;
else
while(k+x<=len)
{
if(strncmp(input+i,input+k,x+1)==0)
{
if(max>=0)
c=c+x;
}
else
c+=calcMis(input,i,k,x);
k=k+1;
}
j=j+1;
}
i=i+1;
}
printf("%d",c);
return 0;
}
このコードは、質問の解決策です:
文字列 S と整数 K が与えられた場合、S1 と S2 の長さが等しく、不一致関数が定義されている場合に Mismatch(S1, S2) <= K となるように、部分文字列 (S1,S2) のペアの数に等しい整数 C を見つけます。下。
例: abc の場合、部分文字列は {a,ab,abc,b,bc,c} です。
これよりも良い方法はありますか。このコードで可能な最適化はありますか?