我刚开始学习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;
}
感谢您的帮助!
答案 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)
参数:
返回值:
此函数返回如下值:
示例:
#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)
由于您只需要一些有关改进代码的建议。
scanf("%20s", str1)
或类似的方法来改善答案的内存占用量。您将需要使用循环来读取字符串。 %20s
要求scanf最多读取20个字符。您可以根据需要定制号码。strlen
中包含的string.h
函数来获取字符串的长度。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 i
或NO
x i
。不管字符串是什么。
希望这说明您的代码出了什么问题。