我想找出一个字符串是否为另一个字符串的字谜。我的代码没有给出正确的输出。我不知道我的逻辑错误是什么

I want to find if one string to anagram of other string or not.My code is not giving a proper output.I don't know what is error in my logic

提问人:JAISHREEDEVAKI T 提问时间:11/17/2023 最后编辑:JAISHREEDEVAKI T 更新时间:11/17/2023 访问量:42

问:

#include<stdio.h>
#include<string.h>
int main()
{
    char str1[100];
    char str2[100];
    scanf("%s %s", str1, str2);
    int a=strlen(str1);
    int b=strlen(str2);
    if(a!=b){printf("NO");return 0;}
    for(int i=0;i<b;i++){
        int k=0;
        for(int j=0;j<a;j++){
            if(str2[i]==str1[j]){k++;
           str1[j]='0';}
        }
        if(k==0){printf("NO");return 0;}
    }
    printf("YES");
}

在上面的代码中,如果我没有使用该代码,则某些输入可以正常工作。我之所以使用这一行,是因为我想知道该字符串是否已被访问。我敢肯定错误出在这一行.但我不知道这个逻辑有什么错误。为什么我不应该使用这条线str1[j]='0';

c

评论

2赞 Scott Hunter 11/17/2023
了解这种格式错误的代码背后的“逻辑”会有所帮助。
1赞 Scott Hunter 11/17/2023
如果原始字符串包含 s 怎么办?0
1赞 stark 11/17/2023
从简单开始。使用字符串“aa”“ab”手动浏览逻辑
1赞 Martin Brown 11/17/2023
一个更好的方法是计算每个单词中每个符号 A-Z 的出现次数,然后检查它们是否具有相同的成分。还允许使用小写字母。编写的代码会说 Arc 和 Car 不是字谜。

答:

1赞 Nierusek 11/17/2023 #1

有几种方法可以检查一个字符串是否是另一个字符串的字谜。我可以举三个例子:

  1. 对两个字符串进行排序并检查它们是否相等
  2. 计算两个字符串中的字母,并检查每个字母的计数是否匹配(这是最简单,最快的方法)
  3. 对于第一个字符串中的每个字母,请尝试在第二个字符串中查找匹配的字母。我想这就是你想做的。

我修改了你的代码来做我认为你想做的事情:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
    /* I do not recommend declaring arrays inside functions, but it's not
       important right now */
    char str1[100];
    char str2[100];
    scanf("%s %s", str1, str2);
    /* Renamed a and b to more meaningful names. And strlen returns size_t, not int */
    size_t str1_len = strlen(str1), str2_len = strlen(str2);
    if (str1_len != str2_len) {
        printf("NO");
        return EXIT_FAILURE; /* Usually, when the program fails, it should not return 0 */
    }
    size_t k = 0;
    for (size_t i = 0; i < str2_len; i++) {
        for (size_t j = 0; j < str1_len; j++) {
            if ((str2[i] != '\0') && (str2[i] == str1[j])) {
                k++;
                /* We mark both letters as matched by substituting them with NULL ('\0').
                   It will not work, if we have '\0' in our alphabet */
                str1[j] = '\0';
                str2[i] = '\0';
            }
        }   
    }
    /* We check, if every letter was matched */
    if (k != str1_len) {
        printf("NO");
        return EXIT_FAILURE;
    }
    printf("YES");
    return EXIT_SUCCESS;
}