Anagram - 最小删除次数 - 某些测试用例失败

时间:2017-07-05 05:59:39

标签: c string for-loop anagram

这是一个解决以下问题的程序"给定两个字符串,并且可能长度相同或不同,确定制作和字谜所需的最小字符删除次数。任何字符都可以从任何字符串中删除"。最后,两个字符串应该具有相同的字母和每个字母的相同频率。例如,字符串A = ccda字符串B = dcac 我的逻辑是用一个虚拟字符串替换两个字符串中相同的字母说" 0"。因此,当我计算每个字符串中不等于" 0"的字母数时,它会给出删除次数。 但我不知道为什么在某些情况下会失败。

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>

int main(){
  int count =0;
  const char dummy= '0';
  int i =0, j=0;
    char* a = (char *)malloc(512000 * sizeof(char));
    scanf("%s",a);
    char* b = (char *)malloc(512000 * sizeof(char));
    scanf("%s",b);
    for (i=0;a[i]!= '\0' ;i++){
      for(j=0; b[j]!= '\0';j++){
        if (a[i]==b[j]){
          a[i]= dummy;
          b[j]= dummy;
        }

      }
    }
    for (i=0;a[i]!= '\0' ;i++){
      if(a[i]!= dummy){
        count = count+1;
      }
    }
    for (i=0;a[i]!= '\0' ;i++){
      if(b[i]!= dummy){
        count = count+1;
      }
    }
    printf("%d",count);
    return 0;
}

失败的一个测试案例是 字符串A:fcrxzwscanmligyxyvym 字符串B:jxwtrhvujlmrpdoqbisbwhmgpmeoke 结果给出:22 预期结果:30

任何人都可以在这里指出错误。请提前谢谢!

1 个答案:

答案 0 :(得分:0)

您的代码出错 - 第二次循环中的条件无效。

for (i=0;a[i]!= '\0' ;i++){
  if(a[i]!= dummy){
    count = count+1;
  }
}
for (i=0;a[i]!= '\0' ;i++){
         ^^^^
  if(b[i]!= dummy){
    count = count+1;
  }
}

标记点应该是b[i]而不是a[i]

轻微的挑剔:因为你正在学习编码,所以试着去找几个有用的习惯。代码应该很漂亮(不是很漂亮,请注意,但是提升) - 它有助于简化您和其他人的阅读。后果很重要。如果你在运营商周围做空间,那就到处做。布局很重要。所有这些都会帮助你注意到你的(对于专业人士来说很常见,他们只是发现它很快)错误。 在运行性能方面也有更好的算法。 :)