【发布时间】:2013-08-12 21:29:45
【问题描述】:
我有一个字符串比较的函数代码如下:
#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,找到等于的整数 C 子串对的数量 (S1,S2) 使得 S1 和 S2 有 等长且 Mismatch(S1, S2)
eg : abc 那么子字符串是 {a,ab,abc,b,bc,c}
还有比这更好的方法吗?这段代码有什么可能的优化吗?
【问题讨论】:
-
好吧,我认为没有理由让接口依赖于两个子字符串在同一个超字符串中。为什么不只取两个指针参数并从调用者传递
string+i和string+j?这更通用,并将工作数据集减少了 1。 -
为什么不使用
strncmp,第一个和第二个参数是:str+i和str+j? -
@Tuntuni:我需要计算不匹配,而不仅仅是字符串是否按字母顺序出现在之前或之后
-
这是让我呕吐的接口之一,因为它需要
char *并且根本不修改它。如果这是 C++,它也会使用std::string,并且可以使用std::mismatch。 -
如果您使用的是 C 风格的字符串,为什么要将此问题标记为 C++?如果你使用 C++,为什么不使用
std::string?