3

私は以下のように文字列比較のための関数コードを持っています:

#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,b​​c,c} です。

これよりも良い方法はありますか。このコードで可能な最適化はありますか?

4

2 に答える 2