【问题标题】:Anagram - Minimum Number of deletion - failing certain test cases字谜 - 删除的最小数量 - 某些测试用例失败
【发布时间】:2017-12-08 15:20:42
【问题描述】:

这是一个解决以下问题的程序“给定两个字符串,and ,长度可能相同也可能不同,确定生成和变位词所需的最小字符删除数。任何字符都可以从任何一个字符串”。最后,两个字符串应该具有相同的字母和每个字母的相同频率。例如,字符串 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

谁能在这里指出错误。请提前致谢!

【问题讨论】:

  • 现在是学习如何使用调试器的最佳时机。使用调试器,您可以逐行执行代码,同时监视变量及其值。对失败的输入执行此操作,看看你的程序会发生什么。
  • @Someprogrammerdude 谢谢 :)

标签: c string for-loop anagram


【解决方案1】:

您的代码中有错误 - 第二个循环中的条件无效。

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]

轻微吹毛求疵:由于您正在学习编码,因此请尽量养成一些有用的习惯。代码应该很漂亮(不是很漂亮,请注意,但很苦行)——它有助于简化你和其他人的阅读。后果很重要。如果您在运算符周围设置空格,请在任何地方都这样做。布局很重要。所有这些都将帮助您注意到您的(专业人士也很常见,他们只是更快地发现)错误。 在运行性能方面还有更好的算法。 :)

【讨论】:

  • 天啊,非常感谢。我从来没有注意到它。我觉得好蠢!现在它完美地工作了。谢谢
  • 谢谢你,我一定会遵守的 :) 更好的逻辑是什么?
  • 哦,这是一个预告片 - 你应该能够自己弄清楚。 :) (如果你不能,那么搜索字谜,我在附近的某个地方看到过)。
猜你喜欢
  • 1970-01-01
  • 2020-02-16
  • 2018-07-07
  • 2014-04-26
  • 2023-03-23
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
相关资源
最近更新 更多