#include <stdio.h>
#include <string.h>
#include <stdlib.h>
static int comp(const void *a, const void *b);
int main(int argc, char ** argv)
{
char s1[]="";
char s2[]="";
char *fmt = "%[^\n]%*c";
printf("Enter the first word? ");
scanf(fmt,&s1);
printf("Enter the second word? ");
scanf(fmt,&s2);
qsort(s1, strlen(s1), 1, comp);
qsort(s2, strlen(s2), 1, comp);
printf("%s : %s - %s\n", s1, s2, strcmp(s1, s2) ? "No" : "Yes");
return 0;
}
static int comp(const void *a, const void *b)
{
const char *pa = (char*)a;
const char *pb = (char*)b;
return
(*pa > *pb) ? 1 :
(*pa < *pb) ? -1 :
0;
}
当我输入'smartest&#39;作为我的第一根绳子和床垫&#39;作为我的第二个字符串,我的输出变为
emrsstt : aemrsstt - No
为什么缺少字符串的第一个字符?
坐了几个小时。如果有人能指出我可能犯下的愚蠢错误,我很高兴。
答案 0 :(得分:0)
这样做的一个聪明方法是首先检查可能的anagram 。你可以通过
来做到这一点比较字符串长度。
对整个集合中的每char
进行异或;从两个字符串中抽取。
如果(2)的结果不为零,则字符串不可能是字谜。这样做的好处是(2)在c中非常快,并且大多数字符串不是字谜,即使它们的长度相同。如果您的感觉特别雄心勃勃,那么可以将(1)和(2)组合成一个O(N)算法!
完成后,请致电您的主代码。您的问题是不允许每个字符串上的 null终结符。您需要为字符串字符分配足够的空间,并为null终止符分配一个额外的元素。
答案 1 :(得分:0)
基本上,当您必须检查任何两组值是否相同时,XOR操作会有所帮助。
Input Output
A B
0 0 0
0 1 1
1 0 1
1 1 0
因此,使用此功能,我们可以解决您的问题,如下所示:
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
int main()
{
int i=0,j=0,f;
char a[30] = "gooo";
char b[30] = "ooog";
if(strlen(a) == strlen(b))
{
while(a[i] != '\0')
{
j = 0;
f =0;
while(b[j] != '\0')
{
if( !(a[i] ^ b[j]) )
{
f =1;
break;
}
j++;
}
if(f)
i++;
else
break;
}
printf("%d\n",i);
if(i == strlen(a))
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
答案 2 :(得分:0)
请检查以下解决方案以获取anagram问题。此解决方案检查两个字符串是否对每个唯一字符具有相同的计数
bool anagram (char s[], char t[])
{
if (strlen(s) != strlen(t)){
return false;
}
int letters[256];
memset(letters,(int)0,sizeof(letters));
int numUniqueChars = 0;
int numCompletedT = 0;
int i;
for (i=0; i < strlen(s); i++){
if (letters[(int)s[i]]==0){
++numUniqueChars;
}
letters[s[i]]=letters[s[i]]+1;
}
for (i=0; i < strlen(t); i++){
int c = (int)t[i];
if (letters[c] == 0){
return false;
}
letters[c]=letters[c]-1;
if (letters[c] == 0){
numCompletedT++;
if (numUniqueChars==numCompletedT){
return i == strlen(t)-1;
}
}
}
return false;
}