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



我刚刚开始学习 C 基础知识并尝试解决这个问题,我们必须检查两个字符串是否相等,前提是任何排列。 您可以参考此链接: 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] != ''; k++)
{
n = rand() % k;
}
for (m = 0; b[m] != ''; m++)
{
o = rand() % m;
}
for (p = 0; p < j; p++)
{
if (a[n] == b[o])
{
printf("YES");
}
else
{
printf("NO");
}
}
return 0;
}

感谢您的帮助!

目前还不清楚你想从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. 您可以使用scanf("%20s", str1)或类似的东西来改善答案的内存占用。您将需要使用循环来读取字符串。%20s要求scanf最多阅读20个字符。您可以根据需要定制数字。
  2. 您可以通过string.h中包含的strlen函数获取字符串的长度。
  3. 您只想检查每个字符的出现时间。在您的情况下,您可以使用长度为 26 的整数数组,或者根据您的算法使用两个整数数组。
  4. 使用更好的变量名称。如果你在算法中做错了什么,这真的很有帮助。

这将是我只针对一个字符串比较的解决方案

用户代码的详细评估

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] != ''; k++)
{
n = rand() % k;
}
for (m = 0; b[m] != ''; 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]。所以结果将是YESxiNOxi.不管字符串是什么。

希望这可以解释您的代码出了什么问题。

为了比较两个字符串,使用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);
}

最新更新