我最近有一个面试问题,我必须写一个带两个字符串的函数,如果它们是彼此的字谜,它会返回1
,否则返回0
。为简化起见,两个字符串的长度相同,非空,并且只包含小写字母和数字字符。
我实现了一个函数,它独立地累积每个字符串的每个字符的XOR值,然后比较每个字符串的最终XOR值,看它们是否相等。如果是,我会返回1
,否则返回0
。
我的功能:
int isAnagram(char* str1, char* str2){
int xor_acc_1 = 0;
int xor_acc_2 = 0;
for(int i = 0; i<strlen(str1); i++){
xor_acc_1 ^= str1[i] - '0';
xor_acc_2 ^= str2[i] - '0';
}
return xor_acc_1 == xor_acc_2;
}
除了一个测试用例外,我的功能适用于所有情况。
char* str1 = "123";
char* str2 = "303";
令我惊讶的是,即使这两个字符串不是彼此的字谜,它们都返回48
作为其XOR值。
我的问题是:这可以在线性时间内使用XOR解决,而不使用数据结构,例如:一张地图,通过修改XOR背后的数学?
答案 0 :(得分:1)
为什么你需要在第一时间做XOR?
最简单,最快速的方法是按字符串排序,并比较两者是否相等。在这种情况下,如果您需要更快的排序算法,您可以使用计数排序来实现线性时间。
另一种方法是,您可以简单地计算每个字符串中的字符数,并检查这些计数是否相等。
基于XOR的解决方案在正确性方面不正确。可以有多个字符组合可以异或相同的数字,两个不同字符串的字符/ ASCII代码的异或可能不会一直产生不同的异或。因此对于相同的字符串,输出将始终正确。但对于不同的字符串,输出可能总是不正确(误报)。