比较C语言中两个字符串的排列

比较C语言中两个字符串的排列,c,c-strings,C,C Strings,我刚开始学习C-basics,并尝试解决这个问题,在这里,我们必须检查两个字符串是否相等,提供任何排列。 您可以参考此链接: 我只是想得到一些关于如何改进代码的解决方案,这些代码只给出“否”的输出: #include<stdio.h> #include<stdlib.h> #include<string.h> int main() { int i, j, k, m, n, o, p; char a[100000], b[100000], *c

我刚开始学习C-basics,并尝试解决这个问题,在这里,我们必须检查两个字符串是否相等,提供任何排列。 您可以参考此链接:

我只是想得到一些关于如何改进代码的解决方案,这些代码只给出“否”的输出:

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

int main()
{
    int i, j, k, m, n, o, p;
    char a[100000], b[100000], *c, *d;
    scanf("%d", &i);

    for (j = 0; j < i; j++)
    {
        scanf("%s %s", a, b);
    }
    for (k = 0; a[k] != '\0'; k++)
    {
        n = rand() % k;
    }
    for (m = 0; b[m] != '\0'; m++)
    {
        o = rand() % m;
    }
    for (p = 0; p < j; p++)
    {
        if (a[n] == b[o])
        {
            printf("YES");
        }
        else
        {
            printf("NO");
        }
    }
    return 0;
}
#包括
#包括
#包括
int main()
{
inti,j,k,m,n,o,p;
字符a[100000],b[100000],*c,*d;
scanf(“%d”、&i);
对于(j=0;j

谢谢你的帮助

比较两个字符串使用的
strcmp()

参数:

  • str1− 这是要比较的第一个字符串
  • str2− 这是要比较的第二个字符串
  • 返回值:

    此函数返回如下值:

    • 如果返回值<0,则表示str1小于str2
    • 如果返回值>0,则表示str2小于str1
    • 如果返回值=0,则表示str1等于str2
    例如:

    #include <stdio.h>
    #include <string.h>
    
    int main () {
       char str1[15];
       char str2[15];
       int ret;
    
    
       strcpy(str1, "abcdef");
       strcpy(str2, "ABCDEF");
    
       ret = strcmp(str1, str2);
    
       if(ret < 0) {
          printf("str1 is less than str2");
       } else if(ret > 0) {
          printf("str2 is less than str1");
       } else {
          printf("str1 is equal to str2");
       }
    
       return(0);
    }
    
    #包括
    #包括
    int main(){
    char-str1[15];
    char-str2[15];
    int ret;
    strcpy(str1,abcdef);
    strcpy(str2,“ABCDEF”);
    ret=strcmp(str1,str2);
    如果(ret<0){
    printf(“str1小于str2”);
    }否则如果(ret>0){
    printf(“str2小于str1”);
    }否则{
    printf(“str1等于str2”);
    }
    返回(0);
    }
    
    因为您只需要一些关于改进代码的建议

  • 您可以使用
    scanf(“%20s”,str1)
    或类似的方法来改善答案的内存占用。您需要使用循环来读取字符串<代码>%20s
    要求scanf最多读取20个字符。您可以根据自己的需要定制号码
  • 您可以通过
    string.h
    中包含的
    strlen
    函数获取字符串的长度
  • 您只需要检查每个字符的出现时间。在本例中,可以使用长度为26的整数数组,也可以使用长度为2的整数数组,具体取决于您的算法
  • 使用更好的变量名。如果您在算法中出错,这将非常有帮助
  • 用户代码的详细评估 上面的代码将执行,每个for循环只产生1个输出,由于它的随机性,我无法判断它将导致哪种结果

    for (p = 0; p < j; p++)
    {
        if (a[n] == b[o])
        {
        printf("YES");
        }
        else
        {
            printf("NO");
        }
    }
    
    for(p=0;p
    该for循环将执行
    i
    次,因为
    j
    的当前值将是
    i
    之前执行的第一个for循环。根据上述原因,这些循环中的每一个都将比较相同的
    a[n]
    b[o]
    。因此结果将是
    YES
    x
    i
    NO
    x
    i
    。不管字符串是什么


    希望这能解释代码的错误。

    不清楚您试图通过
    rand()
    函数实现什么,但现在您肯定需要找到不同的排列来实现这一点。字符串s1的排列应该等于字符串s2,这意味着字符串s1中的所有字符都应该出现在s2中,并且两个字符串中每个字符的计数应该相同

    以下是一个工作版本:

     #include<stdio.h>
     #include<string.h>
     #include<stdlib.h>
    
     //CHECKING IF STRING TWO IS ANY PERMUTATION OF STRING ONE
    
     int main()
     {
         char str_one[]="abbcd";
         char str_two[]="bcab";
         int  arr[26]={0};
         int index=0;
         int len_one=strlen(str_one);
         int len_two=strlen(str_two);
         int val;
    
         if(len_one!=len_two)
         {
              printf("NO");
              exit(0);
         }
    
         while(index<len_one)
         {
             ++arr[str_one[index++]-'a'];
         }
         index=0;
         while(index<len_two)
         {
             --arr[str_two[index++]-'a'];
             if(arr[str_two[index]-'a']<0)
             {
                 printf("NO");
                 exit(0);
             }
         }
         index=0;
    
         while(index<26)
         {
             if(arr[index]!=0)
             {
               printf("NO");
               exit(0);
             }
             ++index;
         }
    
         printf("yes");
    
         return 0;
     }
    
    #包括
    #包括
    #包括
    //检查字符串2是否是字符串1的任何排列
    int main()
    {
    char str_one[]=“abbcd”;
    char str_two[]=“bcab”;
    int-arr[26]={0};
    int指数=0;
    int len_one=strlen(str_one);
    int len_two=strlen(str_two);
    int-val;
    if(len_one!=len_two)
    {
    printf(“否”);
    出口(0);
    }
    
    虽然(字符串
    s1
    的索引排列应该等于字符串
    s2
    ,这意味着字符串
    s1
    中的所有字符都应该出现在
    s2
    中,并且两个字符串中的每个字符的计数应该相同-执行时有什么问题?您可能需要使用si的整数数组ze
    26
    。你在数组中保留了20万字节:/这太荒谬了(而且很容易利用)。最好在您的scanf格式中使用长度说明符。正如Observer所说,您可以只计算每个字符的出现时间,并在可能的情况下比较这些计数。欢迎使用StackOverflow。问题不仅仅是使用
    strcmp
    比较字符串。我以前尝试过将字符串与strcmp进行比较。但是,这是正确的I don’我没有得到一个SIGSEGV/分段错误。我想问这个问题的用户实际上遇到了一个问题,即输出的唯一内容是“否”.我真的同意雅库普·图尔坎解决这个问题的方法,这很有效,非常感谢!!但是,我也想知道我错在哪里,或者说,为什么我不能用我尝试的方式得到答案?如果这看起来很麻烦,很抱歉,但是,因为我只是一个初学者,我很想知道我的代码有什么问题,就像OrdoFlammae评论的那样。@Sujayritikar你应该我想解释一下你的代码段在做什么,它们的预期用途是什么,那么只有我们能提供帮助。@Sujayrttikar我不明白你在用带有rand函数的循环来做什么。如果你能解释一下你认为它做了什么,我可能会说它是否像你预期的那样工作,并评估错误在哪里。@YakupTürkan我想知道我想要得到字符串中字符总数的一个随机整数。通过继续循环这些随机抽取的整数,我可以比较两个字符串的字符。
    for (j = 0 ; j < i ; j++)
    {
        scanf("%s %s", a, b);
        /* do comparision for each here */
    }
    
    for (k = 0; a[k] != '\0'; k++)
    {
        n = rand() % k;
    }
    for (m = 0; b[m] != '\0'; m++)
    {
        o = rand() % m;
    }
    
    for (p = 0; p < j; p++)
    {
        if (a[n] == b[o])
        {
        printf("YES");
        }
        else
        {
            printf("NO");
        }
    }
    
     #include<stdio.h>
     #include<string.h>
     #include<stdlib.h>
    
     //CHECKING IF STRING TWO IS ANY PERMUTATION OF STRING ONE
    
     int main()
     {
         char str_one[]="abbcd";
         char str_two[]="bcab";
         int  arr[26]={0};
         int index=0;
         int len_one=strlen(str_one);
         int len_two=strlen(str_two);
         int val;
    
         if(len_one!=len_two)
         {
              printf("NO");
              exit(0);
         }
    
         while(index<len_one)
         {
             ++arr[str_one[index++]-'a'];
         }
         index=0;
         while(index<len_two)
         {
             --arr[str_two[index++]-'a'];
             if(arr[str_two[index]-'a']<0)
             {
                 printf("NO");
                 exit(0);
             }
         }
         index=0;
    
         while(index<26)
         {
             if(arr[index]!=0)
             {
               printf("NO");
               exit(0);
             }
             ++index;
         }
    
         printf("yes");
    
         return 0;
     }