Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 一个不匹配的子串比较_C++_String_Similarity - Fatal编程技术网

C++ 一个不匹配的子串比较

C++ 一个不匹配的子串比较,c++,string,similarity,C++,String,Similarity,下面是比较字符串a和字符串B与atmost one不匹配的代码 即。, ABC与ABX、AXC或XBC相同,但与AXZ不同 我确实检查了几个案例,但网站说它提供了错误的答案。有人能帮忙找出这段代码在哪里失败吗? 另外,如果有人能为同样的问题提供更好的算法,我会很高兴 泰 int比较(字符串a、int位置、字符串b){ 整数计数=0; int length=b.length()-1; int mid=b.length()/2; 如果(位置+长度>=a.长度()) 返回0; 对于(int i=0,j

下面是比较字符串a和字符串B与atmost one不匹配的代码 即。, ABC与ABX、AXC或XBC相同,但与AXZ不同

我确实检查了几个案例,但网站说它提供了错误的答案。有人能帮忙找出这段代码在哪里失败吗? 另外,如果有人能为同样的问题提供更好的算法,我会很高兴

int比较(字符串a、int位置、字符串b){
整数计数=0;
int length=b.length()-1;
int mid=b.length()/2;
如果(位置+长度>=a.长度())
返回0;
对于(int i=0,j=pos;i=2)返回0;
}
返回1;
}

一个问题是,如果
b.length()
是偶数,那么您将
a[pos+b.length()/2]
b[b.length()/2]
进行两次比较:一次是在
i==mid-1
时,一次是在
i==mid
时。所以类似于
compare(“abcd”,0,“abbd”)
的东西返回
0
,因为它将
'c'
-vs.-
'b'
差异计算为两个单独的不匹配


我建议您只需去掉与
mid
相关的所有逻辑即可。它除了使代码复杂化之外没有其他用途。如果您直接从
0
迭代到
b.length()-1
,您的情况会好得多。

不仅如此,而且当前的访问模式,一次从两个缓冲区的两端工作,具有可怕的缓存行为。@BenVoigt:是的,但我确实认为这是这里最小的问题。如果双端方法有很好的理由,那么缓存行为可能不足以推翻该理由;但因为似乎没有任何理由,我认为这是没有意义的。谢谢Ruakh。。。我解决了这个问题,我不得不提出中间逻辑,希望它能让我的代码在更大的输入下运行得更快,但是,似乎我需要寻找一个新的算法,而不是优化这个使用(N*N)时间的简单方法。你能为这个使用更少时间的操作推荐一个更好的方法吗。TY@Rama:您的
compare
函数需要O(n)个时间,其中n是
b
的长度。由于您必须检查所有
b
,因此无法进一步降低其算法复杂性。如果“这个天真的方法”不是指
compare
函数本身,而是指
compare
只是其中一部分的整个方法,那么你没有给我足够的信息:我甚至不知道你想要实现什么@鲁克。。我拿两个字符串A和B。其中,我需要位置,无论我在哪里发现B-字符串是A的子字符串,atmost一个不匹配的例子::A:abcdefghabX B:abc输出:19“A”中abc的子字符串匹配的位置不是家庭作业,但是,从编程网站上看,这里讨论家庭作业有什么不对吗?@jogojapan:Nothing。它应该被标记为这样。
int compare(string a,  int pos, string b)   {
int count = 0;
int length = b.length()-1;
int mid = b.length() /2;

if(pos+length >= a.length())
    return 0;

for(int i=0,j=pos;i<=mid;i++,j++)   {       
    if(i == mid)    {
        if(a[j] != b[i])
            count ++;
    }
    else    {
        if(a[j] != b[i])
            count ++;
        if(a[pos+length - i] != b[length -i]) 
            count ++;
    }
    if(count >= 2) return 0;
}
return 1;
}