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

时间:2018-09-17 11:48:01

标签: c c-strings

我刚开始学习C-basics,并尝试解决此问题,在这里,我们必须检查两个字符串是否相等(如果有任何排列)。 您可以参考以下链接:https://www.hackerearth.com/practice/basic-programming/input-output/basics-of-input-output/practice-problems/algorithm/two-strings-4/

我只是想获得一些解决方案,以解决如何改进代码以使输出仅为“否”的问题:

#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;
}

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

尚不清楚您要从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;
 }

答案 1 :(得分:0)

要比较两个字符串,请使用strcmp()

int strcmp(const char *str1, const char *str2)

参数:

  1. str1-这是要比较的第一个字符串。
  2. 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);
}

答案 2 :(得分:0)

由于您只需要一些有关改进代码的建议。

  1. 您可以使用scanf("%20s", str1)或类似的方法来改善答案的内存占用量。您将需要使用循环来读取字符串。 %20s要求scanf最多读取20个字符。您可以根据需要定制号码。
  2. 您可以通过strlen中包含的string.h函数来获取字符串的长度。
  3. 您只想检查每个字符的出现时间。根据您的情况,您可以使用长度为26的整数数组,或者根据算法使用两个整数。
  4. 使用更好的变量名。如果您在算法上做错了,这真的很有帮助。

This would be my solution just for one string comparision

用户代码的详细评估

for (j = 0; j < i; j++)
{
    scanf("%s %s", a, b);
}

此代码块读取所有行。 C是按顺序求值的,因此您需要像这样

for (j = 0 ; j < i ; j++)
{
    scanf("%s %s", a, b);
    /* do comparision for each here */
}

如上所述,C是按顺序求值的,因此接下来的2个for循环也求值并从两个字符串中随机选择2个字符。我没有分析概率,但是从我的感觉上我可以说它在大多数情况下不会碰到相同的角色。最好在字符串上循环,而不是祈祷RNG命中。

for (k = 0; a[k] != '\0'; k++)
{
    n = rand() % k;
}
for (m = 0; b[m] != '\0'; m++)
{
    o = rand() % m;
}

上面的代码将执行,每个for循环仅产生1个输出,由于它的随机性,我无法确定它将导致哪个结果。

for (p = 0; p < j; p++)
{
    if (a[n] == b[o])
    {
    printf("YES");
    }
    else
    {
        printf("NO");
    }
}

此for循环将准确执行i次,因为j的当前值将是i作为之前执行的第一个for循环。由于上述原因,每个循环将比较相同的a[n]b[o]。因此结果将为YES x iNO x i。不管字符串是什么。

希望这说明您的代码出了什么问题。